繁体   English   中英

Python 正则表达式中的“无需重复”

[英]"Nothing to repeat" from Python regex

这是一个正则表达式 - 由 egrep 和 Python 2.7 尝试:

$ echo '/some/path/to/file/abcde.csv' | egrep '*([a-zA-Z]+).csv'

/some/path/to/file/ abcde.csv

但是,Python 中的相同正则表达式:

re.match(r'*([a-zA-Z]+)\.csv',f )

给出:

Traceback (most recent call last):
  File "/shared/OpenChai/bin/plothost.py", line 26, in <module>
    hosts = [re.match(r'*([a-zA-Z]+)\.csv',f ).group(1) for f in infiles]
  File "/usr/lib/python2.7/re.py", line 141, in match
    return _compile(pattern, flags).match(string)
  File "/usr/lib/python2.7/re.py", line 251, in _compile
    raise error, v # invalid expression
sre_constants.error: nothing to repeat

进行搜索发现这里似乎存在一个 Python 错误:

正则表达式错误 - 无需重复

这似乎是一个 python 错误(在 vim 中完美运行)。 问题的根源是 (\\s*...)+ 位。

但是,我不清楚:那么上面显示的正则表达式的解决方法是什么 - 让python快乐?

谢谢。

您不需要模式中的* ,它会导致问题,因为您试图量化模式的开头,但没有任何东西,空字符串,可以量化。

同样的“ Nothing to repeat ”错误发生在你

  • 任何量词( +?*{2}{4,5}等)放在模式的开头(例如re.compile(r'?')
  • ^ / \\A字符串锚\\A开头之后添加任何量词(例如re.compile(r'^*')
  • 在字符串锚的$ / \\Z结尾之后添加任何量词(例如re.compile(r'$*')
  • 在单词边界后添加任何量词(例如re.compile(r'\\b*\\d{5}')

但是请注意,在 Python re ,您可以量化任何环视,例如(?<!\\d)*abc(?<=\\d)?abc将产生相同的匹配,因为环视是可选的。

([a-zA-Z]+)\.csv

或者匹配整个字符串:

.*([a-zA-Z]+)\.csv

演示

原因是*未转义,因此被视为量词。 它应用于正则表达式中的前一个子模式。 在这里,它用于模式的开头,因此无法量化任何内容。 因此,不会抛出任何重复的内容。

如果它在 VIM 中“有效”,那只是因为 VIM 正则表达式引擎忽略了这个子模式(与 Java 在像[([)]]这样的字符类中使用未转义的[]一样)。

这不是一个错误 python 正则表达式引擎使用传统的 NFA 来匹配模式。 字符*仅在前面有标记时才起作用。

'*'

使生成的 RE 匹配前面RE 的 0 次或多次重复,尽可能多的重复。 ab* 将匹配 'a'、'ab' 或 'a' 后跟任意数量的 'b'。

因此,您可以使用.*重复任何字符( . ):

r'.*([a-zA-Z]+)\.csv'

python 还提供了支持 Unix shell 风格通配符的模块fnmatch

>>> import fnmatch
>>> s="/some/path/to/file/abcde.csv"
>>> fnmatch.fnmatch(s, '*.csv')
True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM