Python 为什么前面的星号在're.match()'中不起作用,以及如何使它起作用?

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_

为了使我的程序健壮,我希望允许用户在参数中指定正则表达式列表,如:“first_name”,“second_name*”,在从argparse检索参数字符串后手动用逗号拆分

但我注意到,放在前面不起作用

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之类的字符串