Python正则表达式“无可厚非”


问题内容

这是一个正则表达式-由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 幸福?

谢谢。


问题答案:

您不需要*模式中的,它会导致问题。

采用

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

或匹配整个字符串:

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

观看演示

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

如果“作品”中VIM,它仅仅是因为VIM正则表达式引擎忽略这个子模式(等同于Java那样使用转义[]字符类内等[([)]])。