如何在Python 3中打印正则表达式匹配的结果?

11

我在使用 IDLE 编辑器时,决定使用正则表达式来处理字符串。但是当我输入在线教程上告诉我的内容时,它只会输出:

<_sre.SRE_Match object at 0x00000000031D7E68>

完整程序:

import re
reg = re.compile("[a-z]+8?")
str = "ccc8"
print(reg.match(str))

结果:

<_sre.SRE_Match object at 0x00000000031D7ED0>

请问如何实际打印输出结果?


2
尝试使用 print(reg.match(str).group()) - Avinash Raj
2个回答

16

在使用match函数时,需要在其后加上.group()才能打印出匹配的字符串,否则它只会显示是否有匹配。若要打印由捕获组捕获的字符,需要将相应的组索引传递给.group()函数。

>>> import re
>>> reg = re.compile("[a-z]+8?")
>>> str = "ccc8"
>>> print(reg.match(str).group())
ccc8

带有捕获组的正则表达式。

>>> reg = re.compile("([a-z]+)8?")
>>> print(reg.match(str).group(1))
ccc

re.match(pattern, string, flags=0)

如果字符串的开头与正则表达式模式匹配,则返回相应的MatchObject实例。 如果字符串不与模式匹配,则返回None;请注意,这与零长度匹配不同。

即使在MULTILINE模式下,re.match()也只会在字符串开头匹配,而不会在每行开头匹配。


问题在于,当没有匹配时,我会得到“AttributeError:'NoneType'对象没有属性'group'”。 - Ken Ingram

1
如果您需要获取整个匹配值,您应该使用
m = reg.match(r"[a-z]+8?", text)
if m:                          # Always check if a match occurred to avoid NoneType issues
  print(m.group())             # Print the match string

如果你需要提取正则表达式匹配的一部分,你需要在正则表达式中使用捕获组。用一对未转义的括号将这些模式括起来。
为了只打印已捕获的组结果,可以使用Match.groups
返回一个元组,其中包含从 1 到模式中有多少个组的所有子组。默认参数用于没有参与匹配的组;它默认为 None。
因此,要获取ccc8并仅显示这些内容,可以使用
import re
reg = re.compile("([a-z]+)(8?)")
s = "ccc8"
m = reg.match(s)
if m:
  print(m.groups()) # => ('ccc', '8')

查看Python演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接