为什么这个python正则表达式不匹配任何组?

时间:2017-06-10 20:55:19

标签: python regex

在专有工具中帮助朋友使用一些继承的代码。

我们都不太熟悉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)

3 个答案:

答案 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将匹配而没有任何问题。