Python 奇怪的输出正则表达式r';[-.\:alnum:(.*)和#x27;

Python 奇怪的输出正则表达式r';[-.\:alnum:(.*)和#x27;,python,regex,Python,Regex,我希望获取“-”之后的所有字母数字字符 例如: >>> str1 = "12 - mystr" >>> re.findall(r'[-.\:alnum:](.*)', str1) [' mystr'] 首先,很奇怪,空白被认为是字母数字,而我希望得到['mystr'] 第二,如果没有“-”,我无法理解为什么可以提取: 首先,PythonrePOSIX字符类 空格不被视为字母数字,您的第一个模式将-与[-.\:alnum:][/code>匹配,然后(.*)将

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

>>> str1 = "12 - mystr"
>>> re.findall(r'[-.\:alnum:](.*)',  str1)
[' mystr']
首先,很奇怪,空白被认为是字母数字,而我希望得到['mystr']

第二,如果没有“-”,我无法理解为什么可以提取:


首先,Python
re
POSIX字符类

空格不被视为字母数字,您的第一个模式将
-
[-.\:alnum:][/code>匹配,然后
(.*)
将除换行符以外的所有0个或更多字符捕获到组1中。
[-.\:alnum:
模式匹配一个字符,该字符可以是
-
a
l
n
u
m
。因此,当针对
qwertyuio
运行时,
u
被匹配并且
io
被捕获到组1中

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

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

详细信息

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


首先,Python
re
POSIX字符类

空格不被视为字母数字,您的第一个模式将
-
[-.\:alnum:][/code>匹配,然后
(.*)
将除换行符以外的所有0个或更多字符捕获到组1中。
[-.\:alnum:
模式匹配一个字符,该字符可以是
-
a
l
n
u
m
。因此,当针对
qwertyuio
运行时,
u
被匹配并且
io
被捕获到组1中

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

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

详细信息

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

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

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

您的第二个测试发现
u
-.:alnum
字符之一(因为
qwerty
中没有一个匹配任何字符),然后捕获并返回后面的剩余字符
io

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

因此,“匹配
-
,则任何数量的字母数字字符”将是
-([[:alnum:]*)
,除了。所以你必须自己写:
-([A-Za-z0-9]*)

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

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

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

您的第二个测试发现
u
-.:alnum
字符之一(因为
qwerty
中没有一个匹配任何字符),然后捕获并返回后面的剩余字符
io

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

因此,“匹配
-
,则任何数量的字母数字字符”将是
-([[:alnum:]*)
,除了。所以你必须自己写:
-([A-Za-z0-9]*)


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

不太确定要匹配什么。我假设您不想在任何匹配中包含“-”

如果您想获得第一个“-”之后的所有字母数字字符,并跳过所有其他字符,您可以这样做

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

re.match('.*?(?不太确定要匹配什么。我假设您不想在任何匹配中包含'-'。
re.match('.*?(?<=-)(((?<=\s+)?[a-zA-Z\d]+(?=\s+)?)+)', inputString)
re.findall('(?<=-)[a-zA-Z\d]+')