[英]"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.