假设我有一个类似于:
的字符串first_string = "(white cats || 'dogs) && ($1,000 || $500-$900' || 1,000+)"
我用以下文字“替换”替换每个单词:
new_string = re.sub(r'[\w$\-+,][\w$\-+,\t ]*[\w$\-+,]|[\w$\-+,],', "replace", first_string, flags=re.IGNORECASE)
我出去了:
new_string = "(replace || replace) && (replace || replace || replace)"
这很好用。但我想验证new_string是否具有特定格式。
例如,有没有办法使用正则表达式,以确保new_string符合上述一般格式:
&&
||
答案 0 :(得分:0)
未使用正则表达式。
def is_valid(s):
def surrounded_by_parens(s, next_validation):
s = s.strip()
return s.startswith('(') and s.endswith(')') and next_validation(s[1:-1])
def separated_by_bars(s):
return all(x.strip() == 'replace' for x in s.split('||'))
return all(surrounded_by_parens(x, separated_by_bars) for x in s.split('&&'))
assert is_valid("(replace || replace) && (replace || replace || replace)")
assert is_valid("(replace || replace)")
assert not is_valid("(replace replace) && (replace || replace || replace)")
assert not is_valid("(replace || replace) (replace || replace || replace)")
答案 1 :(得分:0)
始终可以使正则表达式匹配您想要的任何配置或格式集。但是,匹配一组格式所需的一些字符串非常长。这个也不错:
re.match(r"\( \w+ (\|\| \w+ )*\)( && \( \w+ (\|\| \w+ )*\))*$", new_string)
这将匹配:
( replace )
( replace || replace || replace )
( replace || replace ) && ( replace )
( replace || replace ) && ( replace || replace ) && ( replace || replace )
答案 2 :(得分:0)
您可以使用以下模式检查字符串结构:
^(?:(?:^|\s*[&|]{2}\s*)\([^|)]+(?:\s*\|\|\s*[^|)]+)*\))*$
如果&&
也可以在括号内,您可以使用:
^(?:(?:^|\s*[&|]{2}\s*)\([^&|)]+(?:\s*[&|]{2}\s*[^&|)]+)*\))*$
如果你的替换模式是好的,你不需要检查父母和“孩子”是否具有相同的结构。
注意:如果您想允许空括号,请将所有+
量词替换为*
答案 3 :(得分:0)
此正则表达式将与描述的foramt (replace || replace) && (replace || replace || replace)
匹配,其中:
^(?:(?:&&|^)\s*\((?:(?:\|\|\s*)?\S+\s*(?=\|\||\)))+\)\s*(?=(?:&&|$)))+
输入文字:
(Areplace || replace) && (replace || replace || replace)
(Breplace || replace) fda && (replace || replace || replace)
(Creplace || replace) && (replace || replace || replace) && (Creplace || replace)
(whitecats || 'dogs) && ($1,000 || $500-$900' || 1,000+)
匹配
[0] => (Areplace || replace) && (replace || replace || replace)
[1] => (Creplace || replace) && (replace || replace || replace) && (Creplace || replace)
[2] => (whitecats || 'dogs) && ($1,000 || $500-$900' || 1,000+)