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

时间:2019-02-18 22:43:44

标签: python regex

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

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

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

第二,如果没有“-”,我不明白为什么可以获取它:

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

3 个答案:

答案 0 :(得分:1)

首先,Python re does not support POSIX字符类。

不将空格视为字母数字,您的第一个模式将-[-.\:alnum:]匹配,然后(.*)将除换行符以外的所有0个或多个字符捕获到组1中。 [-.\:alnum:]模式与一个-.:aln,{ {1}}或u。因此,当与m进行比赛时,qwertyuio被匹配并且u被捕获到组1中。

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

-

请参见regex demo

详细信息

  • re.findall(r'-\s*([^\W_]+)', s) -连字符
  • --超过0个空格
  • \s*-捕获组1:一个或多个(([^\W_]+))字母或数字的字符。

Python demo

+

答案 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]+')