【问题标题】:Regex only finds results once正则表达式只找到一次结果
【发布时间】:2018-04-15 13:35:41
【问题描述】:

我正在尝试在“>”字符和换行符之间查找任何文本,所以我想出了这个正则表达式:

result = re.search(">(.*)\n", text).group(1)

它只适用于一个结果,例如:

>test1
(something else here)

结果如预期的那样是

test1

但只要有多个结果,它只会显示第一个,例如:

>test1
(something else here)
>test2
(something else here)

应该给出类似的东西

test1\ntest2

但只是显示

test1

我错过了什么?非常感谢您。

【问题讨论】:

  • 请发布一些实际示例输入及其输出,而不是 (something else here)
  • 这并不重要,我只是想简化它,因为(这里的其他东西)没有用于显示的代码,只是它包含一个新行(\ n)。无论如何,它应该是 AAECAR8AD40BqAK1A+sH2wntCYEK/gzquwKOwwLXzQLd0gL70wLh4wKL5QIA 之类的代码
  • t1\nt2\nt3 的结果是什么?
  • 这种注释很难写,因为我无法添加新行,但应该是这样的结果:>t1\n(something)\n> t2\n(某事)\n>t3\n(某事)\n

标签: python regex


【解决方案1】:

re.search 只返回第一个匹配项,如documented

扫描字符串寻找第一个位置 表达式模式产生一个匹配,并返回一个对应的 MatchObject 实例。

要查找所有匹配项,请使用findall

返回字符串中所有不重叠的模式匹配,作为一个列表 字符串。从左到右扫描字符串,并返回匹配项 按找到的顺序。

这是一个来自 shell 的示例:

>>> import re
>>> re.findall(">(.*)\n", ">test1\nxxx>test2\nxxx")
['test1', 'test2']

编辑:我刚刚再次阅读了您的问题,并意识到您想要“test1\ntest2”作为输出。好吧,只需使用\n 加入列表即可:

>>>  "\n".join(re.findall(">(.*)\n", ">test1\nxxx>test2\nxxx"))
'test1\ntest2'

【讨论】:

  • 谢谢!它会抛出一个 AttributeError
  • AttributeError: 'list' 对象没有属性 'group'
  • @b0ss192301 不,您不需要对其进行分组。您甚至阅读了整个答案吗?该列表包含第 1 组。由于您想要所有匹配项,因此将它们放入列表中。你想让它们在另一个数据结构中吗?全部连接成一个字符串?
  • 好的,我错过了,非常感谢。它现在正在工作:)
【解决方案2】:

你可以试试:

y = re.findall(r'((?:(?:.+?)(?:(?=[\n\r][^\n\r])\n|))+)', text)

对于't1\nt2\nt3\n' 返回['t1\nt2\nt3']。如果您只是想要字符串,您可以通过以下方式获取它:

s = y[0]

虽然它看起来比您的初始代码大很多,但它会为您提供所需的字符串。

说明-

((?:(?:.+?)(?:(?=[\n\r][^\n\r])\n|))+) 是正则表达式以及匹配项。

(?:(?:.+?)(?:(?=[\n\r][^\n\r])\n|)) 是匹配任何后跟换行符的文本的非捕获组,并被其后的+ 重复找到一次或多次。

(?:.+?) 匹配后面跟着换行符的实际单词。
(?:(?=[\n\r][^\n\r])\n|) 是一个非捕获条件组,它告诉正则表达式如果匹配的文本后面跟着换行符,那么它应该匹配它,如果换行符后面没有另一个换行符或回车符
(?=[\n\r][^\n\r]) 是肯定的前瞻,它确定找到的文本后面是换行符或回车符,并且然后是一些非换行符,与它后面的\n| 结合,告诉正则表达式匹配一个换行符。

诚然,在输入这​​个大杂烩之后,正则表达式相当长且复杂,因此您最好执行您理解的答案,而不是这个答案,您可能不会。但是,这似乎是获得您想要的确切输出的唯一单行答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 2014-12-23
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多