猿问

为什么python返回以下内容?

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


慕田峪9158850
浏览 126回答 2
2回答

温温酱

您看到的是 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,表示它是一个正则表达式。希望这可以帮助!

凤凰求蛊

正如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']
随时随地看视频慕课网APP

相关分类

Python
我要回答