【问题标题】:"Nothing to repeat" from Python regexPython 正则表达式中的“无需重复”
【发布时间】:2015-10-01 21:43:43
【问题描述】:

这是一个正则表达式 - 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 错误:

regex error - nothing to repeat

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

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

谢谢。

【问题讨论】:

  • 你试过.*.*?吗?
  • 这不是 python 错误;你有一个 * (意思是“前一个字符重复 0 次或更多次”)没有前一个字符。
  • * 在正则表达式中的意思是 0 or more of the previous 所以你抱怨的是一个错误根本不是一个错误。你想让* 匹配什么?

标签: python regex


【解决方案1】:

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

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

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

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

使用

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

或者匹配整个字符串:

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

demo

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

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

【讨论】:

    【解决方案2】:

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

    '*'

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

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

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

    python 还提供了模块fnmatch,它支持 Unix shell 样式的通配符。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多