在专有工具中帮助朋友使用一些继承的代码。
我们都不太熟悉Python或Regex。
在下面的代码中,当我使用Pythex(http://pythex.org/)但是返回None时,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) 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)
答案 0 :(得分:2)
此处的正则表达式以^
开头(另外re.match
仅在字符串的开头匹配),但您的testString
不以数字序列开头。
答案 1 :(得分:2)
您在模式中使用.
来匹配度数符号。但是,.
匹配单个字节,而°
实际上是两个字节长:
print len('°') # => 2
因此,您可以在°
模式中使用.
而不是degF
(或\W*
来匹配零个或多个非单词字符,即{{1 }}),在任何地方使用r"(\d+\W+F)\)"
并删除re.search
如果您不打算仅在字符串的开头匹配:
^
请参阅Python demo
您可以在degF = re.findall(r"(\d+°F)\)", testString)
print(degF) # => ['81\xc2\xb0F', '63\xc2\xb0F']
之后将未转义的)
转换为仅匹配整数。您可以将\d+
更改为\d
以匹配浮点数或整数。
答案 2 :(得分:1)
您的字符串包含用两个字节(UTF-8)编码的ASCII范围之外的字符,但您的字符串未定义为unicode字符串,而字形°
被视为2个不同的字符
如果您希望点与°
匹配为单个字素,则需要将字符串定义为unicode字符串:
testString = u"Friday: Thundery Shower, Maximum Temperature: 27°C (81°F) Minimum Temperature: 17°C (63°F)"
然后模式\d+.F
将匹配而没有任何问题。