如何在多行字符串中捕获特定字符和字符串之间的字符串? Python

3

假设我们有一个字符串

string="This is a test code [asdf -wer -a2 asdf] >(ascd asdfas -were)\

 test \

(testing test) test >asdf  \

       test"

我需要获取字符 > 和字符串“test”之间的字符串。

我尝试过:

re.findall(r'>[^)](.*)test',string, re.MULTILINE )

然而,我得到了:
(ascd asdfas -were)\ test \ (testing test) test >asdf.

然而我需要:
(ascd asdfas -were)\ 

asdf

我该如何获得这两个字符串?


所以,我试图修复你的代码块,你能确认它们是否符合你的意图吗? - jedwards
谢谢。这就是我想要的。 - Sam
1
这是一个很好的正则表达式构建器,可以帮助您进行测试 https://regex101.com/#python - ti7
1个回答

2

那么呢:

import re

s="""This is a test code [asdf -wer -a2 asdf] >(ascd asdfas -were)
test
(testing test) test >asdf
test"""

print(re.findall(r'>(.*?)\btest\b', s, re.DOTALL))

输出:

['(ascd asdfas -were)\n', 'asdf\n']

这个模式中唯一有点意思的部分是:
- .*?,其中?使.*“非贪婪”,否则您将只有一个长匹配而不是两个。 - 使用\btest\b作为“结束”标识符(请参见下面Jan的评论),而不是test。在这里

\b匹配空字符串,但仅在单词的开头或结尾处...

请注意,可能需要阅读一下re.DOTALL,因为我认为那才是你真正想要的。 DOTALL允许字符包括换行符,而MULTILINE允许锚点(^$)匹配行的开头和结尾,而不是整个字符串。考虑到您没有使用锚点,我认为DOTALL更合适。

1
非常感谢。这正是我在寻找的。我也很感激您的解释。一旦允许,我会立即接受这个答案。 - Sam
1
请注意,这将匹配testertesterfieldtestman(你懂的)中的test - 也要应用单词边界:\btest\b - Jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接