Python 为什么前面的星号在're.match()'中不起作用,以及如何使它起作用?
为了使我的程序健壮,我希望允许用户在参数中指定正则表达式列表,如:“first_name”,“second_name*”,在从argparse检索参数字符串后手动用逗号拆分 但我注意到,放在前面不起作用Python 为什么前面的星号在're.match()'中不起作用,以及如何使它起作用?,python,regex,Python,Regex,为了使我的程序健壮,我希望允许用户在参数中指定正则表达式列表,如:“first_name”,“second_name*”,在从argparse检索参数字符串后手动用逗号拆分 但我注意到,放在前面不起作用 import re word = 'blah' regexp = re.compile('*blah*') if regexp.match(word): print('matched') else: print('failed') ,它抛出错误: $ python regex_
import re
word = 'blah'
regexp = re.compile('*blah*')
if regexp.match(word):
print('matched')
else:
print('failed')
,它抛出错误:
$ python regex_test.py
Traceback (most recent call last):
File "regex_test.py", line 3, in <module>
regexp = re.compile('*blah*')
File "/usr/lib/python2.7/re.py", line 194, in compile
return _compile(pattern, flags)
File "/usr/lib/python2.7/re.py", line 251, in _compile
raise error, v # invalid expression
sre_constants.error: nothing to repeat
星号放在末尾没有问题,例如重新编译“blah*”,所以我想知道背后的原因是什么,如何修复它
请注意,我选择re.match而不是re.search,因为我希望精确匹配,但仍然允许使用诸如星号之类的正则表达式,即“123blah”不应与“blah*”正则表达式匹配。*在正则表达式中,表示重复之前的任何内容,0次或更多次。*在一个正则表达式的开头是毫无意义的,这也是nothing重复错误的原因
而且,我相信布拉也没有达到你的期望。它将匹配bla,后跟0或更多h
我相信您希望使用*作为通配符,它在正则表达式中表示为.*blah...正则表达式中的*表示零次或多次,您不需要指定应该重复的内容。在您的示例中,第二个_name*将与字母e匹配零次或多次
如果要查找包含单词的字符串,请使用:
.*second_name.*
您的*second_name*是有效的shell glob格式,但不是有效的Regex格式。正则表达式中的类似项是。*第二个名称。*/*?第二个名称。*
*表示匹配前面的标记0次或多次,但*某物中没有前面的标记,因此出现错误
有效的正则表达式:
.*second_name.*
或非贪婪形式:
.*?second_name.*
*将匹配任何字符。零次或多次*
后一种形式是什么?将不贪婪地匹配,而较早的将贪婪地匹配
此外,除非您匹配字符串的结尾,否则可以在第二个名称后删除。*,因为它将变得多余。请参阅正则表达式文档。 开头的星号是无效的表达式。 如果要在字符串开头匹配任何字符,可以在星号之前使用点,如。*
末尾的星号起作用。因为h*表示匹配重复h零次或多次。这是REGEX而不是windows文件资源管理器-请阅读REGEX的工作原理。使用并向下滚动可获得正则表达式的链接。请试用正则表达式,看看发生了什么。@PatrickArtner我是一个linux爱好者,我认为正则表达式的工作原理类似于shell扩展,例如“ls*filename*”,因此链接为:regex!=shell扩展,它有自己的语法。regex/info有很多指向好的源代码的链接。blah*的可能副本将匹配blahhh和bla之类的字符串