为什么这个python正则表达式不匹配任何组?
在专用工具中使用一些继承的代码帮助朋友 我们都不太熟悉Python或正则表达式 在下面的代码中,当我使用Pythex()时,degF正则表达式匹配2个组,但不返回任何组。我做错了什么为什么这个python正则表达式不匹配任何组?,python,regex,Python,Regex,在专用工具中使用一些继承的代码帮助朋友 我们都不太熟悉Python或正则表达式 在下面的代码中,当我使用Pythex()时,degF正则表达式匹配2个组,但不返回任何组。我做错了什么 # This Python file uses the following encoding: utf-8 import os, sys import re testString = "Friday: Thundery Shower, Maximum Temperature: 27°C (81°F) Minimu
# This Python file uses the following encoding: utf-8
import os, sys
import re
testString = "Friday: Thundery Shower, Maximum Temperature: 27°C (81°F) Minimum Temperature: 17°C (63°F)"
t = re.match("^([^:]+):\s*([^,]+)", testString)
degF = re.match("^(\d+.F\))", testString)
print t . # _sre.SRE_Match object
print t.group(1) # Friday
print t.group(2) # Thundery Shower
print degF # None
# print "Max temp " + degF.group(1)
# print "Min temp " + degF.group(2)
这里的regexp以
^
开头(另外re.match
仅在字符串开头匹配),但是testString
不是以数字序列开头。这里的regexp以^
开头(另外re.match
仅在字符串开头匹配),但是您的测试字符串
不是以数字序列开头。您在模式中使用了
来匹配度符号。但是,一个
匹配一个字节,而°
实际上有两个字节长:
print len('°') # => 2
因此,您可以在degF
模式(或\W*
中使用°
而不是
来匹配零个或多个非单词字符,即r“(\d+\W+F)\”
),如果您不打算只在字符串开头匹配,请使用到处搜索,并删除^
:
degF = re.findall(r"(\d+°F)\)", testString)
print(degF) # => ['81\xc2\xb0F', '63\xc2\xb0F']
见
您可以将未缩放的)
移动到\d+
之后的右边,以仅匹配整数。您可以将\d
更改为\d[\d.]*
以匹配浮点数或整数。您在模式中使用了
来匹配度符号。但是,一个
匹配一个字节,而°
实际上有两个字节长:
print len('°') # => 2
因此,您可以在degF
模式(或\W*
中使用°
而不是
来匹配零个或多个非单词字符,即r“(\d+\W+F)\”
),如果您不打算只在字符串开头匹配,请使用到处搜索,并删除^
:
degF = re.findall(r"(\d+°F)\)", testString)
print(degF) # => ['81\xc2\xb0F', '63\xc2\xb0F']
见
您可以将未缩放的)
移动到\d+
之后的右边,以仅匹配整数。您可以将\d
更改为\d[\d.]*
以匹配浮点数或整数。您的字符串包含ASCII范围之外的字符,这些字符用两个字节(UTF-8)编码,但您的字符串未定义为unicode字符串,并且图形名°
被视为两个不同的字符
如果希望点作为单个图形匹配°
,则需要将字符串定义为unicode字符串:
testString = u"Friday: Thundery Shower, Maximum Temperature: 27°C (81°F) Minimum Temperature: 17°C (63°F)"
然后模式\d+.F
将匹配,不会出现任何问题。您的字符串包含ASCII范围以外的字符,这些字符用两个字节(UTF-8)编码,但您的字符串未定义为unicode字符串,并且图形名°
被视为两个不同的字符
如果希望点作为单个图形匹配°
,则需要将字符串定义为unicode字符串:
testString = u"Friday: Thundery Shower, Maximum Temperature: 27°C (81°F) Minimum Temperature: 17°C (63°F)"
然后模式\d+.F
将毫无问题地匹配。re.match(^(\d+.F\)”
您正在字符串开头查找温度。如果要提取温度值,请使用此选项:re.findall('(\d+°\w+),teststring)
或re.findall('(\d+°[F | C]),a)
您的表达式工作:re.match(^(\d+.F\)”
您正在字符串开头查找温度。如果您想提取温度值,请使用此选项:re.findall('(\d+°\w+),teststring)
或re.findall('(\d+°[F | C]),a)
您的表达式工作:啊,这是早期测试的遗留问题,但即使是像([0-9]+.F])这样的东西也不是working@Rob,即使您使用re.search
?degF=re.search(([0-9]+.F)),testString也会给我None@RobCowell:这同样有效:,这里一定有一些不同。使用r“(\d+°F\)”
Ah,这是早期测试的遗留问题,但甚至类似于([0-9]+.F))不是吗working@Rob,即使您使用re.search
?degF=re.search(([0-9]+.F)),testString也会给我None@RobCowell:这同样有效:,这里一定有一些不同。使用r“(\d+°F\)”
最接近的-只需计算捕捉第(2)组中的第二个°F值否,您只想使用re.findall
then.Ah,最初很混乱,因为一个返回列表,另一个返回MatchObject,所以不同的语法将它们拉回来,但现在得到了它,感谢最终代码作为参考-#此Python文件使用以下编码:utf-8导入os,sys import re testString=“星期五:雷雨阵雨,最高温度:27℃(81℉)最低温度:17℃(63℉)”t=re.match(^([^:+):\s*(^,]+”,testString)#degF=re.findall(([0-9]+.F)),testString)degF=re.findall(r)(\d+°F)),testString)print t t t t t t t t t.group(1)#星期五打印t.group(2)#雷雨阵雨打印degF print”Max temp“+degF[0]打印最接近的“Min temp F”+degF[1”-只需解决捕获组(2)中的第二个°F值的问题。不,您只需要使用re.findall
即可。啊,最初很困惑,因为一个返回列表,另一个返回匹配对象,所以不同的语法将它们拉回来,但现在得到了它,感谢最终代码供参考-#此Python文件使用以下编码:utf-8导入操作系统,sys-import-re-testString=“星期五:雷雨阵雨,最高温度:27°C(81°F)最低温度:17°C(63°F)”t=re.match(^([^:]+):\s*([^,]+),testString)#degF=re.findall((([0-9]+.F)),testString)degF=re.findall(r)(\d+.F))“,测试字符串)打印t打印t组(1)#周五打印t组(2)#雷雨雨打印degF打印“最高温度F”+degF[0]打印“最低温度F”+degF[1]