如何在re.compile中使用format()

时间:2018-10-25 01:34:29

标签: regex python-3.6

我想编写一个正则表达式,命令python返回由len=2定义的具有元音序列的列表中的项。

>>> chars = "aeiou"
>>> len = 2
>>> regex = re.compile(r"[+{}+]{{len}}",format(chars))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/re.py", line 234, in compile
    return _compile(pattern, flags)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/re.py", line 286, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_compile.py", line 764, in compile
    p = sre_parse.parse(p, flags)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_parse.py", line 930, in parse
    p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
TypeError: unsupported operand type(s) for &: 'str' and 'int'
>>> 
>>> def funct(regex,list):
...     for item in list:
...         if regex.search(item):
...             print(item)
... 
>>> list = ['avid','Chaos','st','Cy']
>>> 
>>> funct(regex,list)
avid
Chaos

我应该只会得到Chaos,而不是avid。我无法理解将len参数输入到re.compile模块中。

2 个答案:

答案 0 :(得分:1)

您对格式的误用与正则表达式无关。看来,在所有其他一切之上,您不正确地尝试将f字符串与格式一起使用。除其他外,您需要为f字符串加上<<前缀,并且可以使用带句点而不是逗号的方法来调用方法。

这两个格式化操作是可以互换的,并且具有明确定义的评估顺序(f字符串,然后是格式化方法)。但是,通常最好使用其中一个,而不是同时使用两者。否则事情会变得不必要地复杂。

使用f弦:

f

双括号被解释为格式字符串中的文字大括号。您需要另一个第三组来表示regex = re.compile(f"[{chars}]{{{len}}}") 是格式化的表达式。

使用格式:

len

同时使用(出于完整性考虑):

regex = re.compile("[{}]{{{}}}".format(chars, len))
regex = re.compile("[{chars}]{{{len}}}".format(chars= chars, len=len))
regex = re.compile("[{0}]{{{len}}}".format(chars, len=len))

在任何情况下,您都无需在角色类中使用regex = re.compile(f"[{{}}]{{{{{len}}}}}".format(chars)) 。在方括号中,+与文字加字符匹配。它不充当某些神奇的量词。另外,在字符类中重复字符毫无意义。

由于您的字符串中没有任何反斜杠,因此它不必是原始字符串,也不需要+前缀。

答案 1 :(得分:0)

您可以通过在字符串文字的引号之前添加f来使用f字符串,以便可以在len周围使用一对大括号来评估其值作为字符串的一部分,并使用.(而不是,)来调用字符串的format方法。但是由于f字符串在传递给str.format进行格式化之前首先被评估,为了使空的大括号{}由f字符串解析器按字面意义保留,您将必须使用double curl括号以逃避它们。但是,由于您需要将len的值括起来,才能使其成为正则表达式中的量词,因此您需要通过将str.format加倍以保留大括号来再次转义它们:

regex = re.compile(fr"[+{{}}+]{{{{{len}}}}}".format(chars))

由于大括号在所有f字符串str.format和正则表达式中都有特殊的含义,因此建议您使用字符串格式运算符%来格式化字符串,这样就不必处理上面的逃生地狱:

regex = re.compile(r'[+%s+]{%d}' % (chars, len))