为了账号安全,请及时绑定邮箱和手机立即绑定

为什么python返回以下内容?

为什么python返回以下内容?

慕田峪9158850 2022-06-02 15:09:47
p = re.compile('x*')print(p.search('abxd'))输出:<re.Match object; span=(0, 0), match=''>p = re.compile('x+')print(p.search('abxd'))输出:<re.Match object; span=(2, 3), match='x'>
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

您看到的是 Python(更具体地说,是 Regex 模块)返回一个 re.Mach object。这个对象有方法和类,你可以调用它们来得到你想要的结果。


例如,如果您只想将匹配作为字符串,则此代码将打印它:


>>> expression = re.compile('.+')

>>> result = expression.search('abcd')

>>> print(result.group())

'abcd'

您当前的代码(第一个示例)还包含一个与输入字符串不匹配的表达式,这可能是一些混乱的根源。在我提供的示例中,我使用了.+,它将匹配任何字符零到无限次。Regex101.com在帮助创建 Regex 表达式和理解语法方面做得非常出色。


这是RegexMatch对象的文档(您在当前代码中得到的内容),具体来说,这里是该.group()方法的文档。


快速说明:

您不需要在调用搜索函数之前编译表达式(但是,这完全是个人喜好,但它更常用;在调用搜索函数之前编译表达式是有正当理由的,但这超出了范围回答这个问题)。以下两个代码块将执行完全相同的操作:


expression = re.compile('.+')

print(expression.search('string'))

print(re.search(r'.+', 'string'))

在第二块中,表达式是搜索函数中的第一个参数,r前面有a,表示它是一个正则表达式。


希望这可以帮助!


查看完整回答
反对 回复 2022-06-02
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

正如re.search() 的文档所说:


扫描字符串寻找正则表达式模式产生匹配的第一个位置,并返回相应的匹配对象。如果字符串中没有位置与模式匹配,则返回 None;请注意,这与在字符串中的某个点找到零长度匹配不同。


(强调我的)


您的第一个 RegExx*匹配零个或多个character x。在所有匹配项中,返回第一个匹配项。您的模式与字符串的开头匹配,因为它是zero 'x's. <re.Match object; span=(0, 0), match=''>因此,您的比赛在位置 0 ( )开始和结束。


当您搜索时,x+这意味着一个或多个 character x。您的字符串中唯一x的位置是位置2(第三个字符,但我们从 0 开始计数)。它是一个字符长,所以它在位置 3 结束。因此你的 result <re.Match object; span=(2, 3), match='x'>。


如果您查看所有匹配项而不仅仅是第一个匹配项,您也会看到其他匹配项!你可以这样做,例如使用re.findall()


例子:


>>> re.findall(r'x+', 'abxb')

['x']

>>> re.findall(r'x*', 'abxb')

['', '', 'x', '', '']

如您所见,匹配零个或多个意味着我们也匹配了字母之间所有不存在的字符!当与其他模式结合使用时,零或更多的这个特性会更有用,即如果我们想说一个字符或单词在我们的匹配中是可选的。假设我们想要匹配所有b后跟零个或多个xes 的 s:


>>> re.findall(r'bx*', 'abxb')

['bx', 'b']


查看完整回答
反对 回复 2022-06-02
  • 2 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信