正则表达式只找到一次结果

时间:2018-04-15 13:35:42

标签: python regex

我试图在'>'之间找到任何文字。字符和新行,所以我想出了这个正则表达式:

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

它只与一个结果完美配合,例如:

>test1
(something else here)

结果如预期的那样

test1

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

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

应该提供类似

的内容
test1\ntest2

但只是显示

test1

我错过了什么?非常感谢你提前。

2 个答案:

答案 0 :(得分:2)

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'

答案 1 :(得分:1)

你可以尝试:

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

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

s = y[0]

虽然它似乎大于您的初始代码,但它会为您提供所需的字符串。

说明 -

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

(?:(?:.+?)(?:(?=[\n\r][^\n\r])\n|))是非捕获组,匹配任何文字后跟换行符,并且+后面的(?:.+?)重复发现一次或多次。

(?:(?=[\n\r][^\n\r])\n|)匹配实际的单词,然后是换行符 (?=[\n\r][^\n\r])是一个非捕获条件组,它告诉正则表达式,如果匹配的文本后跟换行符,那么它应该匹配它,如果换行符后面没有其他换行符或回车符< /强>
\n|是一个积极的前瞻,它确定找到的文本后跟换行符或回车符,然后是一些非换行符,后面跟 dat_subset <- reactive({ req(input$selected_type) filter(dat, outcome %in% input$selected_type) }) output$scatterplot <- renderPlot({ ggplot(data = dat_subset(), aes_string(x = input$x, y = input$y, color = input$z)) + geom_boxplot() + labs() }) output$nsdtable <- DT::renderDataTable({ DT::datatable(data = dat_subset()[, 1:4], options = list(pageLength = 10), rownames = FALSE) }) 结合,告诉正则表达式匹配换行符。

当然,在输入这​​个大问题后,正则表达式是相当漫长而复杂的,所以你最好实现你理解的答案,而不是这个答案,你可能不会。但是,这似乎是获得您想要的准确输出的唯一一线答案。