我希望获取“-”之后的所有字母数字字符 例如:
>>> str1 = "12 - mystr"
>>> re.findall(r'[-.\:alnum:](.*)', str1)
[' mystr']
首先,奇怪的是空白被认为是字母数字,而我希望得到['mystr']。
第二,如果没有“-”,我不明白为什么可以获取它:
>>> str2 = "qwertyuio"
>>> re.findall(r'[-.\:alnum:](.*)', str2)
['io']
答案 0 :(得分:1)
首先,Python re
does not support POSIX字符类。
不将空格视为字母数字,您的第一个模式将-
与[-.\:alnum:]
匹配,然后(.*)
将除换行符以外的所有0个或多个字符捕获到组1中。 [-.\:alnum:]
模式与一个-
,.
,:
,a
,l
,n
,{ {1}}或u
。因此,当与m
进行比赛时,qwertyuio
被匹配并且u
被捕获到组1中。
字母数字字符可以与io
模式匹配。因此,要捕获[^\W_]
之后的所有字母数字字符,然后使用0+空格
-
请参见regex demo
详细信息
re.findall(r'-\s*([^\W_]+)', s)
-连字符-
-超过0个空格\s*
-捕获组1:一个或多个(([^\W_]+)
)字母或数字的字符。+
答案 1 :(得分:1)
您的正则表达式说:“找到任何一个字符-.:alnum
,然后将任意数量的任何字符捕获到第一个捕获组中。”
在第一个测试中,它找到第一个字符-
,然后在第一个捕获组中捕获了mystr
。如果正则表达式中有任何组,则findall
返回找到的组列表,而不是匹配项,因此不包括匹配的-
。
您的第二个测试发现u
是-.:alnum
个字符之一(因为qwerty
都不匹配),然后捕获并返回了其余字符io
。
正如@revo在注释中指出的,[....]
是一个字符类-匹配其中的任何一个字符。为了在其中包含POSIX字符类(例如[:alnum:]
),您需要两组括号。而且,字符类中没有顺序;您在其中包含-
的事实只是意味着它将是匹配的字符之一,不是,如果没有它,字母数字字符将被匹配。最后,如果您想匹配任意数量的字母数字,那么您在错误的地方使用了量词*
。
因此,“匹配-
,然后匹配任意数量的字母数字字符”将是-([[:alnum:]]*)
,除外 ... Python does not support POSIX character classes。因此,您必须编写自己的-([A-Za-z0-9]*)
。
但是,这将与您的字符串不匹配,因为如您所注意到的,中间空格是不是一个字母数字字符。为了解决这个问题,请-\s*([A-Za-z0-9]*)
。
答案 2 :(得分:0)
不太确定要匹配什么。我假设您不想在任何比赛中都包含“-”。
如果要获取第一个“-”之后的所有字母数字字符,并跳过所有其他字符,则可以执行以下操作。
re.match('.*?(?<=-)(((?<=\s+)?[a-zA-Z\d]+(?=\s+)?)+)', inputString)
如果要在每个“-”之后找到每个字母数字字符串,则可以执行此操作。
re.findall('(?<=-)[a-zA-Z\d]+')