我希望获取"-"之后的所有字母数字字符 举个例子:
>>> str1 = "12 - mystr"
>>> re.findall(r'[-.:alnum:](.*)', str1)
[' mystr']
首先,奇怪的是,空格被认为是字母数字,而我希望得到['mystr']。
其次,如果没有"-",我不明白为什么可以获取它:
>>> str2 = "qwertyuio"
>>> re.findall(r'[-.:alnum:](.*)', str2)
['io']
首先,Pythonre
不支持 POSIX 字符类。
空格不被视为字母数字,您的第一个模式将-
与[-.:alnum:]
匹配,然后(.*)
捕获除换行符以外的所有 0 个或多个字符到组中 1。[-.:alnum:]
模式匹配一个字符,即-
、.
、:
、a
、l
、n
、u
或m
。因此,当对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]+')