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,表示它是一个正则表达式。
希望这可以帮助!
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']
添加回答
举报