Yuv*_*mon 4 python regex parsing
我有一个文本,我需要在python中解析.
这是一个字符串,我想将它拆分为一个行列表,但是,如果换行符(\n)在引号内,那么我们应该忽略它.
例如:
abcd efgh ijk\n1234 567"qqqq\n---" 890\n
Run Code Online (Sandbox Code Playgroud)
应该解析为以下行的列表:
abcd efgh ijk
1234 567"qqqq\n---" 890
Run Code Online (Sandbox Code Playgroud)
我已尝试过split('\n'),但我不知道如何忽略这些引号.
任何的想法?
谢谢!
这是一个更容易的解决方案.
匹配组的(?:"[^"]*"|.)+.即,"引号中的东西或不是换行符的东西".
例:
import re
re.findall('(?:"[^"]*"|.)+', text)
Run Code Online (Sandbox Code Playgroud)
注意:这会将多个换行合并为一个,因为空行会被忽略.为了避免这种情况,也要给出一个空案例:(?:"[^"]*"|.)+|(?!\Z).
这(?!\Z)是一种令人困惑的方式来说"不是字符串的结尾".这(?! )是消极的前瞻; 这\Z是"字符串的结尾"部分.
测试:
import re
texts = (
'text',
'"text"',
'text\ntext',
'"text\ntext"',
'text"text\ntext"text',
'text"text\n"\ntext"text"',
'"\n"\ntext"text"',
'"\n"\n"\n"\n\n\n""\n"\n"'
)
line_matcher = re.compile('(?:"[^"]*"|.)+')
for text in texts:
print("{:>27} ? {}".format(
text.replace("\n", "\\n"),
" [LINE] ".join(line_matcher.findall(text)).replace("\n", "\\n")
))
#>>> text ? text
#>>> "text" ? "text"
#>>> text\ntext ? text [LINE] text
#>>> "text\ntext" ? "text\ntext"
#>>> text"text\ntext"text ? text"text\ntext"text
#>>> text"text\n"\ntext"text" ? text"text\n" [LINE] text"text"
#>>> "\n"\ntext"text" ? "\n" [LINE] text"text"
#>>> "\n"\n"\n"\n\n\n""\n"\n" ? "\n" [LINE] "\n" [LINE] "" [LINE] "\n"
Run Code Online (Sandbox Code Playgroud)