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

Posted

技术标签:

【中文标题】如何在 python 3 中打印正则表达式匹配结果?【英文标题】:How to print regex match results in python 3? 【发布时间】:2014-12-13 19:46:07 【问题描述】:

我当时处于空闲状态,并决定使用正则表达式来整理一个字符串。但是当我输入在线教程告诉我的内容时,它所要做的就是打印:

<_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>

谁能告诉我如何实际打印结果?

【问题讨论】:

试试print(reg.match(str).group()) 【参考方案1】:

您需要在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(模式、字符串、标志=0)

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

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

【讨论】:

问题是,当没有匹配时我得到 ** "AttributeError: 'NoneType' object has no attribute 'group'"**【参考方案2】:

如果你需要获取整个匹配值,你应该使用

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

如果您需要提取正则表达式匹配的一部分,您需要在正则表达式中使用capturing groups。用一对未转义的括号将这些模式括起来。

要仅打印捕获的组结果,请使用 Match.groups

返回一个包含匹配的所有子组的元组,从 1 到模式中的任何组。默认参数用于未参加比赛的组;它默认为无。

所以,要获取 ccc8 并仅显示它们,您可以使用

import re
reg = re.compile("([a-z]+)(8?)")
s = "ccc8"
m = reg.match(s)
if m:
  print(m.groups()) # => ('ccc', '8')

见Python demo

【讨论】:

以上是关于如何在 python 3 中打印正则表达式匹配结果?的主要内容,如果未能解决你的问题,请参考以下文章

用Python正则表达式从一个匹配项中打印出2个项目。

Python - 使用正则表达式查找多个匹配项并将它们打印出来[重复]

python 正则表达式如何截取字符串中间的内容

正则表达式高级替换,匹配后进行运算,然后使用结果替换,怎么实现?

Python全栈_Day11_grep和正则表达式

如何使用 awk 打印匹配的正则表达式模式?