我需要过滤一些格式不正确的文字。因此,有很多情况下,文本中的引号从一行开始,然后切断并在第二行结束。在这种情况下,我的首选是完全删除部分引号,但我想保留常规的完整引号。我知道这可以用计数器迭代完成,但我真的更喜欢用正则表达式来解决它。
以前例为例:
"This is a quote" This is an end "partial- quote" Here is more text. This is an end "partial- quote w/o more text" This is an "embedded" quote
Here是我当前尝试的示例 (\"[^\"\n]+?|^[^\"\n]+?\")(\n|$)
请注意,它在两种情况下失败:
我认为我可以设置一个if语句并运行每一行,检查它是否少于两个引号,然后继续解析部分引号,但我认为SO的思想会有一个更清晰的解决方案。
注意所需的输出为:
"This is a quote" This is an end Here is more text. This is an end This is an "embedded" quote
(我稍后处理空白)
答案 0 :(得分:2)
你走了,
^((?:[^"\n]*"[^"\n]*")*[^"\n]*)"[^"\n]*\n[^"\n]*"(\n|)
将匹配的字符替换为\1\n
>>> import re
>>> s = '''"This is a quote"
This is an end "partial-
quote" Here is more text.
This is an end "partial-
quote w/o more text"
This is an "embedded" quote'''
>>> m = re.sub(r'(?m)^((?:[^"\n]*"[^"\n]*")*[^"\n]*)"[^"\n]*\n[^"\n]*"(\n|)', r'\1\n', s)
>>> print(m)
"This is a quote"
This is an end
Here is more text.
This is an end
This is an "embedded" quote
如果你想处理双引号之间存在的多条线,请使用这个正则表达式。
^((?:[^"\n]*"[^"\n]*")*[^"\n]*)"(?:[^"\n]*\n)+[^"\n]*"(\n|)
答案 1 :(得分:1)
你可以使用这个正则表达式:
"[^"\n]+?\n[^"\n]+?(?:"|$)\s*
并替换为\n
。
"[^"\n]+?\n[^"\n]+?
仅匹配部分引号(确保引号之间有换行符)。
答案 2 :(得分:1)
("[^"\n]*")|"[^"]*(\n)[^"]*"(?![^\n]*")|"[^"]*\n.*?(?=\n[^"]*"[^\n"]*")
你可以试试这个。这也将采用奇数引号。参见演示。