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:一个或多个字母或数字(+
)字符
:
首先,Pythonre
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]+')