Files
MeeeyoAI-ComfyUI_StringOps/meyo_node_String.py
T
2025-04-21 16:27:17 +08:00

1109 lines
36 KiB
Python

import datetime
import random
import secrets
import requests
import string
import math
import re
#======文本输入
class SingleTextInput:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"text": ("STRING", {"default": "", "multiline": True}),
}
}
RETURN_TYPES = ("STRING",)
FUNCTION = "process_input"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
OUTPUT_NODE = False
def process_input(self, text):
return (text,)
#======多参数输入
class MultiParamInputNode:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"text1": ("STRING", {"default": "", "multiline": True}), # 第一个多行文本输入框
"text2": ("STRING", {"default": "", "multiline": True}), # 第二个多行文本输入框
"int1": ("INT", {"default": 0, "min": -1000000, "max": 1000000}), # 第一个整数输入框
"int2": ("INT", {"default": 0, "min": -1000000, "max": 1000000}), # 第二个整数输入框
}
}
RETURN_TYPES = ("STRING", "STRING", "INT", "INT") # 返回两个字符串和两个整数
FUNCTION = "process_inputs"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
OUTPUT_NODE = False
def process_inputs(self, text1, text2, int1, int2):
return (text1, text2, int1, int2)
#======添加前后缀
class AddPrefixSuffix:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_string": ("STRING", {"default": ""}),
"prefix": ("STRING", {"default": "前缀符"}),
"suffix": ("STRING", {"default": "后缀符"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "add_prefix_suffix"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def add_prefix_suffix(self, input_string, prefix, suffix):
return (f"{prefix}{input_string}{suffix}",)
#======提取标签之间
class ExtractSubstring:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_string": ("STRING", {"multiline": True, "default": ""}),
"pattern": ("STRING", {"default": "标签始|标签尾"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "extract_substring"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def extract_substring(self, input_string, pattern):
try:
parts = pattern.split('|')
start_str = parts[0]
end_str = parts[1] if len(parts) > 1 and parts[1].strip() else "\n"
start_index = input_string.index(start_str) + len(start_str)
end_index = input_string.find(end_str, start_index)
if end_index == -1:
end_index = input_string.find("\n", start_index)
if end_index == -1:
end_index = len(input_string)
extracted = input_string[start_index:end_index]
lines = extracted.splitlines()
non_empty_lines = [line for line in lines if line.strip()]
result = '\n'.join(non_empty_lines)
return (result,)
except ValueError:
return ("",)
#======按数字范围提取
class ExtractSubstringByIndices:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_string": ("STRING", {"default": ""}),
"indices": ("STRING", {"default": "2-6"}),
"direction": (["从前面", "从后面"], {"default": "从前面"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "extract_substring_by_indices"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def extract_substring_by_indices(self, input_string, indices, direction):
try:
if '-' in indices:
start_index, end_index = map(int, indices.split('-'))
else:
start_index = end_index = int(indices)
start_index -= 1
end_index -= 1
if start_index < 0 or start_index >= len(input_string):
return ("",)
if end_index < 0 or end_index >= len(input_string):
end_index = len(input_string) - 1
if start_index > end_index:
start_index, end_index = end_index, start_index
if direction == "从前面":
return (input_string[start_index:end_index + 1],)
elif direction == "从后面":
start_index = len(input_string) - start_index - 1
end_index = len(input_string) - end_index - 1
if start_index > end_index:
start_index, end_index = end_index, start_index
return (input_string[start_index:end_index + 1],)
except ValueError:
return ("",)
#======分隔符拆分两边
class SplitStringByDelimiter:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_string": ("STRING", {"default": "文本|内容"}),
"delimiter": ("STRING", {"default": "|"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING", "STRING")
FUNCTION = "split_string_by_delimiter"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def split_string_by_delimiter(self, input_string, delimiter):
parts = input_string.split(delimiter, 1)
if len(parts) == 2:
return (parts[0], parts[1])
else:
return (input_string, "")
#======常规处理字符
class ProcessString:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_string": ("STRING", {"multiline": True, "default": ""}),
"option": (["不改变", "取数字", "取字母", "转大写", "转小写", "取中文", "去标点", "去换行", "去空行", "去空格", "去格式", "统计字数"], {"default": "不改变"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "process_string"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def process_string(self, input_string, option):
if option == "取数字":
result = ''.join(re.findall(r'\d', input_string))
elif option == "取字母":
result = ''.join(filter(lambda char: char.isalpha() and not self.is_chinese(char), input_string))
elif option == "转大写":
result = input_string.upper()
elif option == "转小写":
result = input_string.lower()
elif option == "取中文":
result = ''.join(filter(self.is_chinese, input_string))
elif option == "去标点":
result = re.sub(r'[^\w\s\u4e00-\u9fff]', '', input_string)
elif option == "去换行":
result = input_string.replace('\n', '')
elif option == "去空行":
result = '\n'.join(filter(lambda line: line.strip(), input_string.splitlines()))
elif option == "去空格":
result = input_string.replace(' ', '')
elif option == "去格式":
result = re.sub(r'\s+', '', input_string)
elif option == "统计字数":
result = str(len(input_string))
else:
result = input_string
return (result,)
@staticmethod
def is_chinese(char):
return '\u4e00' <= char <= '\u9fff'
#======提取前后字符
class ExtractBeforeAfter:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_string": ("STRING", {"default": ""}),
"pattern": ("STRING", {"default": "标签符"}),
"position": (["保留最初之前", "保留最初之后", "保留最后之前", "保留最后之后"], {"default": "保留最初之前"}),
"include_delimiter": ("BOOLEAN", {"default": False}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "extract_before_after"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def extract_before_after(self, input_string, pattern, position, include_delimiter):
if position == "保留最初之前":
index = input_string.find(pattern)
if index != -1:
result = input_string[:index + len(pattern) if include_delimiter else index]
return (result,)
elif position == "保留最初之后":
index = input_string.find(pattern)
if index != -1:
result = input_string[index:] if include_delimiter else input_string[index + len(pattern):]
return (result,)
elif position == "保留最后之前":
index = input_string.rfind(pattern)
if index != -1:
result = input_string[:index + len(pattern) if include_delimiter else index]
return (result,)
elif position == "保留最后之后":
index = input_string.rfind(pattern)
if index != -1:
result = input_string[index:] if include_delimiter else input_string[index + len(pattern):]
return (result,)
return ("",)
#======替换第n次出现
class ReplaceNthOccurrence:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"original_text": ("STRING", {"multiline": True, "default": ""}),
"occurrence": ("INT", {"default": 1, "min": 0}),
"search_str": ("STRING", {"default": "替换前字符"}),
"replace_str": ("STRING", {"default": "替换后字符"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "replace_nth_occurrence"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def replace_nth_occurrence(self, original_text, occurrence, search_str, replace_str):
if occurrence == 0:
result = original_text.replace(search_str, replace_str)
else:
def replace_nth_match(match):
nonlocal occurrence
occurrence -= 1
return replace_str if occurrence == 0 else match.group(0)
result = re.sub(re.escape(search_str), replace_nth_match, original_text, count=occurrence)
return (result,)
#======多次出现依次替换
class ReplaceMultiple:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"original_text": ("STRING", {"multiline": True, "default": ""}),
"replacement_rule": ("STRING", {"default": ""}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "replace_multiple"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def replace_multiple(self, original_text, replacement_rule):
try:
search_str, replacements = replacement_rule.split('|')
replacements = [rep for rep in replacements.split(',') if rep]
def replace_match(match):
nonlocal replacements
if replacements:
return replacements.pop(0)
return match.group(0)
result = re.sub(re.escape(search_str), replace_match, original_text)
return (result,)
except ValueError:
return ("",)
#======批量替换字符
class BatchReplaceStrings:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"original_text": ("STRING", {"multiline": False, "default": "文本内容"}),
"replacement_rules": ("STRING", {"multiline": True, "default": ""}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "batch_replace_strings"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def batch_replace_strings(self, original_text, replacement_rules):
rules = replacement_rules.strip().split('\n')
for rule in rules:
if '|' in rule:
search_strs, replace_str = rule.split('|', 1)
search_strs = search_strs.replace("\\n", "\n")
replace_str = replace_str.replace("\\n", "\n")
search_strs = search_strs.split(',')
for search_str in search_strs:
original_text = original_text.replace(search_str, replace_str)
return (original_text,)
#======随机行内容
class RandomLineFromText:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "get_random_line"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def IS_CHANGED():
return float("NaN")
def get_random_line(self, input_text):
lines = input_text.strip().splitlines()
if not lines:
return ("",)
return (random.choice(lines),)
#======判断是否包含字符
class CheckSubstringPresence:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"default": "文本内容"}),
"substring": ("STRING", {"default": "查找符1|查找符2"}),
"mode": (["同时满足", "任意满足"], {"default": "任意满足"}),
},
"optional": {},
}
RETURN_TYPES = ("INT",)
FUNCTION = "check_substring_presence"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def check_substring_presence(self, input_text, substring, mode):
substrings = substring.split('|')
if mode == "同时满足":
for sub in substrings:
if sub not in input_text:
return (0,)
return (1,)
elif mode == "任意满足":
for sub in substrings:
if sub in input_text:
return (1,)
return (0,)
#======段落每行添加前后缀
class AddPrefixSuffixToLines:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"prefix_suffix": ("STRING", {"default": "前缀符|后缀符"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "add_prefix_suffix_to_lines"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def add_prefix_suffix_to_lines(self, prefix_suffix, input_text):
try:
prefix, suffix = prefix_suffix.split('|')
lines = input_text.splitlines()
modified_lines = [f"{prefix}{line}{suffix}" for line in lines]
result = '\n'.join(modified_lines)
return (result,)
except ValueError:
return ("",)
#======段落提取指定索引行
class ExtractAndCombineLines:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"line_indices": ("STRING", {"default": "2-3"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "extract_and_combine_lines"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def extract_and_combine_lines(self, input_text, line_indices):
try:
lines = input_text.splitlines()
result_lines = []
if '-' in line_indices:
start, end = map(int, line_indices.split('-'))
start = max(1, start)
end = min(len(lines), end)
result_lines = lines[start - 1:end]
else:
indices = map(int, line_indices.split('|'))
for index in indices:
if 1 <= index <= len(lines):
result_lines.append(lines[index - 1])
result = '\n'.join(result_lines)
return (result,)
except ValueError:
return ("",)
#======段落提取或移除字符行
class FilterLinesBySubstrings:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"substrings": ("STRING", {"default": "查找符1|查找符2"}),
"action": (["保留", "移除"], {"default": "保留"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "filter_lines_by_substrings"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def filter_lines_by_substrings(self, input_text, substrings, action):
lines = input_text.splitlines()
substring_list = substrings.split('|')
result_lines = []
for line in lines:
contains_substring = any(substring in line for substring in substring_list)
if (action == "保留" and contains_substring) or (action == "移除" and not contains_substring):
result_lines.append(line)
non_empty_lines = [line for line in result_lines if line.strip()]
result = '\n'.join(non_empty_lines)
return (result,)
#======根据字数范围过滤文本行
class FilterLinesByWordCount:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"word_count_range": ("STRING", {"default": "2-10"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "filter_lines_by_word_count"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def filter_lines_by_word_count(self, input_text, word_count_range):
try:
lines = input_text.splitlines()
result_lines = []
if '-' in word_count_range:
min_count, max_count = map(int, word_count_range.split('-'))
result_lines = [line for line in lines if min_count <= len(line) <= max_count]
result = '\n'.join(result_lines)
return (result,)
except ValueError:
return ("",)
#======按序号提取分割文本
class SplitAndExtractText:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"delimiter": ("STRING", {"default": "分隔符"}),
"index": ("INT", {"default": 1, "min": 1}),
"order": (["顺序", "倒序"], {"default": "顺序"}),
"include_delimiter": ("BOOLEAN", {"default": False}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "split_and_extract"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def split_and_extract(self, input_text, delimiter, index, order, include_delimiter):
try:
if not delimiter:
parts = input_text.splitlines()
else:
parts = input_text.split(delimiter)
if order == "倒序":
parts = parts[::-1]
if index > 0 and index <= len(parts):
selected_part = parts[index - 1]
if include_delimiter and delimiter:
if order == "顺序":
if index > 1:
selected_part = delimiter + selected_part
if index < len(parts):
selected_part += delimiter
elif order == "倒序":
if index > 1:
selected_part += delimiter
if index < len(parts):
selected_part = delimiter + selected_part
lines = selected_part.splitlines()
non_empty_lines = [line for line in lines if line.strip()]
result = '\n'.join(non_empty_lines)
return (result,)
else:
return ("",)
except ValueError:
return ("",)
#======文本出现次数
class CountOccurrences:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"char": ("STRING", {"default": "查找符"}),
},
"optional": {},
}
RETURN_TYPES = ("INT", "STRING")
FUNCTION = "count_text_segments"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def count_text_segments(self, input_text, char):
try:
if char == "\\n":
lines = [line for line in input_text.splitlines() if line.strip()]
count = len(lines)
else:
count = input_text.count(char)
return (count, str(count))
except ValueError:
return (0, "0")
#======文本拆分:根据索引和特定字符获取多行文本中的行内容
class ExtractLinesByIndex:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"delimiter": ("STRING", {"default": "标签符"}),
"index": ("INT", {"default": 1, "min": 1}),
},
"optional": {},
}
RETURN_TYPES = ("STRING", "STRING", "STRING", "STRING", "STRING")
FUNCTION = "extract_lines_by_index"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
OUTPUT_TYPES = ("STRING", "STRING", "STRING", "STRING", "STRING")
OUTPUT_NAMES = ("文本1", "文本2", "文本3", "文本4", "文本5")
def extract_lines_by_index(self, input_text, index, delimiter):
try:
if delimiter == "" or delimiter == "\n":
lines = input_text.splitlines()
else:
lines = input_text.split(delimiter)
result_lines = []
for i in range(index - 1, index + 4):
if 0 <= i < len(lines):
result_lines.append(lines[i])
else:
result_lines.append("")
return tuple(result_lines)
except ValueError:
return ("", "", "", "", "")
#======提取特定行
class ExtractSpecificLines:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"line_indices": ("STRING", {"default": "1|2"}),
"split_char": ("STRING", {"default": "\n"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING", "STRING", "STRING", "STRING", "STRING", "STRING")
FUNCTION = "extract_specific_lines"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def extract_specific_lines(self, input_text, line_indices, split_char):
if not split_char or split_char == "\n":
lines = input_text.split('\n')
else:
lines = input_text.split(split_char)
indices = [int(index) - 1 for index in line_indices.split('|') if index.isdigit()]
results = []
for index in indices:
if 0 <= index < len(lines):
results.append(lines[index])
else:
results.append("")
while len(results) < 5:
results.append("")
non_empty_results = [result for result in results[:5] if result.strip()]
if not split_char or split_char == "\n":
combined_result = '\n'.join(non_empty_results)
else:
combined_result = split_char.join(non_empty_results)
return tuple(results[:5] + [combined_result])
#======删除标签内的内容
class RemoveContentBetweenChars:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"chars": ("STRING", {"default": "(|)"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "remove_content_between_chars"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def remove_content_between_chars(self, input_text, chars):
try:
if len(chars) == 3 and chars[1] == '|':
start_char, end_char = chars[0], chars[2]
else:
return input_text
pattern = re.escape(start_char) + '.*?' + re.escape(end_char)
result = re.sub(pattern, '', input_text)
return (result,)
except ValueError:
return ("",)
#======随机打乱
class ShuffleTextLines:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"delimiter": ("STRING", {"default": "分隔符"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "shuffle_text_lines"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def IS_CHANGED():
return float("NaN")
def shuffle_text_lines(self, input_text, delimiter):
if delimiter == "":
lines = input_text.splitlines()
elif delimiter == "\n":
lines = input_text.split("\n")
else:
lines = input_text.split(delimiter)
lines = [line for line in lines if line.strip()]
random.shuffle(lines)
if delimiter == "":
result = "\n".join(lines)
elif delimiter == "\n":
result = "\n".join(lines)
else:
result = delimiter.join(lines)
return (result,)
#======判断返回内容
class ConditionalTextOutput:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"original_content": ("STRING", {"multiline": True, "default": ""}),
"check_text": ("STRING", {"default": "查找字符"}),
"text_if_exists": ("STRING", {"default": "存在返回内容"}),
"text_if_not_exists": ("STRING", {"default": "不存在返回内容"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "conditional_text_output"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def conditional_text_output(self, original_content, check_text, text_if_exists, text_if_not_exists):
if not check_text:
return ("",)
if check_text in original_content:
return (text_if_exists,)
else:
return (text_if_not_exists,)
#======文本按条件判断
class TextConditionCheck:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"original_content": ("STRING", {"multiline": True, "default": ""}), # 输入多行文本
"length_condition": ("STRING", {"default": "3-6"}),
"frequency_condition": ("STRING", {"default": ""}),
},
"optional": {},
}
RETURN_TYPES = ("INT", "STRING")
FUNCTION = "text_condition_check"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def text_condition_check(self, original_content, length_condition, frequency_condition):
length_valid = self.check_length_condition(original_content, length_condition)
frequency_valid = self.check_frequency_condition(original_content, frequency_condition)
if length_valid and frequency_valid:
return (1, "1")
else:
return (0, "0")
def check_length_condition(self, content, condition):
if '-' in condition:
start, end = map(int, condition.split('-'))
return start <= len(content) <= end
else:
target_length = int(condition)
return len(content) == target_length
def check_frequency_condition(self, content, condition):
conditions = condition.split('|')
for cond in conditions:
char, count = cond.split(',')
if content.count(char) != int(count):
return False
return True
#======文本组合
class TextConcatenation:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"original_text": ("STRING", {"multiline": True, "default": ""}),
"concatenation_rules": ("STRING", {"multiline": True, "default": ""}),
"split_char": ("STRING", {"default": ""}),
},
"optional": {},
}
RETURN_TYPES = ("STRING", "STRING", "STRING", "STRING", "STRING")
FUNCTION = "text_concatenation"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def text_concatenation(self, original_text, concatenation_rules, split_char):
if split_char:
original_lines = [line.strip() for line in original_text.split(split_char) if line.strip()]
else:
original_lines = [line.strip() for line in original_text.split('\n') if line.strip()]
rules_lines = [line.strip() for line in concatenation_rules.split('\n') if line.strip()]
outputs = []
for rule in rules_lines[:5]:
result = rule
for i, line in enumerate(original_lines, start=1):
result = result.replace(f"[{i}]", line)
outputs.append(result)
while len(outputs) < 5:
outputs.append("")
return tuple(outputs)
#======提取多层指定数据
class ExtractSpecificData:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"rule1": ("STRING", {"default": "[3],@|2"}),
"rule2": ("STRING", {"default": "三,【|】"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "extract_specific_data"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def extract_specific_data(self, input_text, rule1, rule2):
if rule1.strip():
return self.extract_by_rule1(input_text, rule1)
else:
return self.extract_by_rule2(input_text, rule2)
def extract_by_rule1(self, input_text, rule):
try:
line_rule, split_rule = rule.split(',')
split_char, group_index = split_rule.split('|')
group_index = int(group_index) - 1
except ValueError:
return ("",)
lines = input_text.split('\n')
if line_rule.startswith('[') and line_rule.endswith(']'):
try:
line_index = int(line_rule[1:-1]) - 1
if 0 <= line_index < len(lines):
target_line = lines[line_index]
else:
return ("",)
except ValueError:
return ("",)
else:
target_lines = [line for line in lines if line_rule in line]
if not target_lines:
return ("",)
target_line = target_lines[0]
parts = target_line.split(split_char)
if 0 <= group_index < len(parts):
return (parts[group_index],)
return ("",)
def extract_by_rule2(self, input_text, rule):
try:
line_rule, tags = rule.split(',')
start_tag, end_tag = tags.split('|')
except ValueError:
return ("",)
lines = input_text.split('\n')
if line_rule.startswith('[') and line_rule.endswith(']'):
try:
line_index = int(line_rule[1:-1]) - 1
if 0 <= line_index < len(lines):
target_line = lines[line_index]
else:
return ("",)
except ValueError:
return ("",)
else:
target_lines = [line for line in lines if line_rule in line]
if not target_lines:
return ("",)
target_line = target_lines[0]
start_index = target_line.find(start_tag)
end_index = target_line.find(end_tag, start_index)
if start_index != -1 and end_index != -1:
return (target_line[start_index + len(start_tag):end_index],)
return ("",)
#======指定字符行参数
class FindFirstLineContent:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"input_text": ("STRING", {"multiline": True, "default": ""}),
"target_char": ("STRING", {"default": "数据a"}),
},
"optional": {},
}
RETURN_TYPES = ("STRING",)
FUNCTION = "find_first_line_content"
CATEGORY = "Meeeyo/String"
DESCRIPTION = "如需更多帮助或商务需求(For tech and business support)+VX/WeChat: meeeyo"
def find_first_line_content(self, input_text, target_char):
try:
lines = input_text.splitlines()
for line in lines:
if target_char in line:
start_index = line.index(target_char)
result = line[start_index + len(target_char):]
return (result,)
return ("",)
except Exception as e:
return (f"Error: {str(e)}",)