我试图在'>'之间找到任何文字。字符和新行,所以我想出了这个正则表达式:
result = re.search(">(.*)\n", text).group(1)
它只与一个结果完美配合,例如:
>test1
(something else here)
结果如预期的那样
test1
但只要有多个结果,它就会显示第一个结果,如:
>test1
(something else here)
>test2
(something else here)
应该提供类似
的内容test1\ntest2
但只是显示
test1
我错过了什么?非常感谢你提前。
答案 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)
})
结合,告诉正则表达式匹配换行符。
当然,在输入这个大问题后,正则表达式是相当漫长而复杂的,所以你最好实现你理解的答案,而不是这个答案,你可能不会。但是,这似乎是获得您想要的准确输出的唯一一线答案。