首页 > 解决方案 > 奇怪的输出正则表达式 r'[-.\:alnum:](.*)'

问题描述

我希望在“-”之后获取所有字母数字字符例如:

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

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

其次,如果没有“-”,我无法理解为什么可以获取它:

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

标签: pythonregex

解决方案


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

空格不被视为字母数字,您的第一个模式匹配-然后[-.\:alnum:](.*)除换行符之外的所有 0 个或更多字符捕获到第 1 组中。该[-.\:alnum:]模式匹配一​​个字符,即-, ., :, a, l, n,um. 因此,当针对 , 运行时qwertyuiou匹配并被io捕获到第 1 组。

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

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

查看正则表达式演示

细节

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

Python演示

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

推荐阅读