如何正确处理regex匹配

2024-03-29 02:37:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我的应用程序中有来自外部的字符串,这些字符串可能带有引号:

Prefix content. "Some content goes here". More contents without quotes.
Prefix content. "Another "Additional" goes here". More contents without quotes.
Prefix content. "Just another "content". More contents without quotes.

关键是字符串带有引号,我需要正确处理这些引号。实际上,我需要捕捉引号中的所有内容。我尝试了.*(".*").*.*(".+").*这样的模式,但它们似乎只捕获两个最接近的引号之间的内容。你知道吗


Tags: 字符串应用程序内容prefixheremorecontentsanother
3条回答

我不确定你想提取什么,所以我猜。我建议使用partitionrpartition字符串方法。你知道吗

这是你想要的吗?你知道吗

>>> samples = [
...   'Prefix content. "Some content goes here". More contents without quotes.',
...   'Prefix content. "Another "Additional" goes here". More contents without quotes.',
...   'Prefix content. "Just another "content". More contents without quotes.',
... ]
>>> def get_content(data):
...   return data.partition('"')[2].rpartition('"')[0]
...
>>> for sample in samples:
...   print get_content(sample)
...
Some content goes here
Another "Additional" goes here
Just another "content

看起来你只需要从第一个报价到最后一个报价的所有内容,即使中间还有其他报价。这就足够了:

".*"

您的正则表达式中的前导和尾随.*是不需要的,并且前导的一个正在扭曲您的结果。它将首先消耗整个输入,然后后退足够远,让regex的其余部分匹配,这意味着(".*")将只匹配最后两个引号。你知道吗

你也不需要括号。您要查找的字符串部分现在是整个匹配项,因此可以使用group(0)而不是group(1)检索它。如果字符串中可能有换行符,并且您也希望匹配这些换行符,则可以将其更改为:

(?s)".*"

.元字符通常不匹配换行符,但是(?s)为regex的其余部分打开DOTALL模式。你知道吗


EDIT:我忘了提到在本例中应该使用search()方法,而不是match()match()仅当在输入的最开始处找到匹配项时才起作用,就像添加了起始锚点一样(例如^".*")。search()执行更传统的regex匹配,匹配可以出现在输入的任何地方。(ref

编辑:我现在看到另一个答案,我可能误解了你的问题。你知道吗

试着改变这个

.*(".+").*

.*?(".+?")

?将使搜索变得非贪婪,并在找到下一个匹配字符(即引号)时立即停止。我还删除了结尾处的.*,因为它将匹配字符串的其余部分(不考虑引号)。如果您也想匹配空引号,只需将+更改为*。使用re.findall从引号中提取所有内容。你知道吗

PS:我想你的最后一行是错的,因为它没有匹配的引号。你知道吗

相关问题 更多 >