奇怪的输出正则表达式 r'[-.\:alnum:](.*)'



我希望获取"-"之后的所有字母数字字符 举个例子:

>>> str1 = "12 - mystr"
>>> re.findall(r'[-.:alnum:](.*)',  str1)
[' mystr']

首先,奇怪的是,空格被认为是字母数字,而我希望得到['mystr']。

其次,如果没有"-",我不明白为什么可以获取它:

>>> str2 = "qwertyuio"
>>> re.findall(r'[-.:alnum:](.*)',  str2)
['io']

首先,Pythonre不支持 POSIX 字符类。

空格不被视为字母数字,您的第一个模式将-[-.:alnum:]匹配,然后(.*)捕获除换行符以外的所有 0 个或多个字符到组中 1。[-.:alnum:]模式匹配一个字符,即-.:alnum。因此,当对qwertyuio运行时,u被匹配,io被捕获到第1组。

字母数字字符可以与[^W_]模式匹配。因此,要捕获-后跟 0+ 空格的所有字母数字字符,您可以使用

re.findall(r'-s*([^W_]+)', s)

查看正则表达式演示

  • -- 连字符
  • s*- 0+ 空格
  • ([^W_]+)- 捕获组 1:一个或多个 (+) 个字符,它们是字母或数字。

蟒蛇演示:

print(re.findall(r'-s*([^W_]+)', '12 - mystr')) # => ['mystr']
print(re.findall(r'-s*([^W_]+)', 'qwertyuio'))  # => []

您的正则表达式说:"找到-.:alnum中的任何一个字符,然后将任意数量的任意字符捕获到第一个捕获组中"。

在第一个测试中,它找到了第一个字符的-,然后在第一个捕获组中捕获了mystr。如果正则表达式中有任何组,findall返回找到的组的列表,而不是匹配项,因此不包括匹配的-

您的第二个测试发现u-.:alnum字符之一(因为qwerty都不匹配),然后捕获并返回其后的其余字符,io

正如@revo注释中指出的那样,[....]是一个字符类 - 匹配其中的任何一个字符。为了在其中包含一个POSIX字符类(如[:alnum:]),你需要两组括号。此外,字符类中没有顺序;您在其中包含-的事实只是意味着它将是匹配的字符之一,而不是没有它就会匹配字母数字字符。最后,如果你想匹配任意数量的字母数字,你的量词*错误的东西。

因此,"匹配-,那么任意数量的字母数字字符"将是-([[:alnum:]]*)除了...Python 不支持 POSIX 字符类。所以你必须写你自己的:-([A-Za-z0-9]*).

但是,这将与您的字符串不匹配,因为正如您所注意的,中间空格不是字母数字字符。为了解释这一点,-s*([A-Za-z0-9]*).

不太确定要匹配的内容。我假设您不想在任何匹配中包含"-"。

如果您想获取第一个"-"之后的所有字母数字字符并跳过所有其他字符,您可以执行以下操作。

re.match('.*?(?<=-)(((?<=s+)?[a-zA-Zd]+(?=s+)?)+)', inputString)

如果要在每个"-"之后查找每个字母数字字符串,则可以执行此操作。

re.findall('(?<=-)[a-zA-Zd]+')

最新更新