1

假设我有一个看起来像这样的字符串:

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 符合上述一般格式,其中:

  • 总是有一组括号,由一个分隔&&
  • 每个括号集包含由分隔的字符串||
  • 每个paren set中的字符串数量和paren set的数量可能会有所不同?
4

4 回答 4

0

描述

此正则表达式将匹配所描述的格式(replace || replace) && (replace || replace || replace),其中:

  • 总是有一组括号,用 && 分隔
  • 每个括号集包含由 || 分隔的字符串
  • 每个paren set中的字符串数量和paren set的数量可能会有所不同?

^(?:(?:&&|^)\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+)
于 2013-06-20T15:37:02.193 回答
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)")
于 2013-06-20T15:12:08.623 回答
0

始终可以使正则表达式匹配您想要的任何一组配置或格式。然而,匹配一组格式所需的一些字符串非常长。这个还不错:

re.match(r"\( \w+ (\|\| \w+ )*\)( && \( \w+ (\|\| \w+ )*\))*$", new_string)

这将匹配:

( replace )
( replace || replace || replace )
( replace || replace ) && ( replace )
( replace || replace ) && ( replace || replace ) && ( replace || replace )
于 2013-06-20T15:25:38.490 回答
0

您可以使用以下模式检查您的字符串结构:

^(?:(?:^|\s*[&|]{2}\s*)\([^|)]+(?:\s*\|\|\s*[^|)]+)*\))*$

if&&也可以在括号内,您可以使用:

^(?:(?:^|\s*[&|]{2}\s*)\([^&|)]+(?:\s*[&|]{2}\s*[^&|)]+)*\))*$

如果您的替换模式很好,则无需检查父级和“子级”是否具有相同的结构。

注意:如果要允许空括号,请将所有+量词替换为*

于 2013-06-20T15:33:17.000 回答