我有一个需要用 python 解析的文本。
这是一个字符串,我想将其拆分为行列表,
但是,如果换行符 (\n) 在引号内,那么我们应该忽略它。
例如:
abcd efgh ijk\n1234 567"qqqq\n---" 890\n
应解析为以下几行的列表:
abcd efgh ijk
1234 567"qqqq\n---" 890
我已经尝试过split('\n')
,但我不知道如何忽略引号。
任何想法?
Thanks!
这是一个更简单的解决方案。
匹配组(?:"[^"]*"|.)+
。即,“引号中的内容或不是换行符的内容”。
Example:
import re
re.findall('(?:"[^"]*"|.)+', text)
NOTE:这会将多个换行符合并为一个,因为空白行将被忽略。为了避免这种情况,也给出一个 null 情况:(?:"[^"]*"|.)+|(?!\Z)
.
The (?!\Z)
是一种令人困惑的说法“不是字符串的结尾”。这(?!
)
是负前瞻;这\Z
是“字符串的结尾”部分。
Tests:
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"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)