python regex也使用换行符查找值

时间:2019-05-10 11:46:11

标签: python regex

我正在解决我无法解决的正则表达式问题。我制作的正则表达式

import re
message = """[key    X] value
[key    X]  value value
[key    X]  value
value
value
value
[key     ] value
[key     ] ?
[key     ] ?"""

messageRegex = re.compile(r"\[(.*?)][\s](.*)")

for value in messageRegex.findall(message):
    print(value)

如下所示,它的输出不是所有内容都被捕获。

('key    X', 'value') ('key\tX', 'value value') ('key\tX', 'value')
('key\t ', 'value') ('key\t ', '?') ('key\t ', '?')

enter image description here

我希望输出看起来像

('key    X', 'value') ('key\tX', 'value value') ('key\tX', 'value \nvalue \nvalue \nvalue')
('key\t ', 'value') ('key\t ', '?') ('key\t ', '?')

1 个答案:

答案 0 :(得分:3)

您可以使用

(?m)^\[([^][]*)]\s+(.*(?:\n(?!\[[^][]*]).*)*)

请参见regex demo

详细信息

  • ^-一行的开头
  • \[-[
  • ([^][]*)-第1组:除[]以外的任何0+个字符
  • ]-一个]字符
  • \s+-超过1个空格
  • (.*(?:\n(?!\[[^][]*]).*)*)-第2组:
    • .*-该行的其余部分
    • (?:\n(?!\[[^][]*]).*)*-零次或多次重复:
      • \n(?!\[[^][]*])-换行符后没有[...]子字符串
      • .*-该行的其余部分

Python demo

import re
message = """[key    X] value
[key    X]  value value
[key    X]  value
value
value
value
[key     ] value
[key     ] ?
[key     ] ?"""

messageRegex = re.compile(r"^\[([^][]*)]\s+(.*(?:\n(?!\[[^][]*]).*)*)", re.M)

for value in messageRegex.findall(message):
    print(value)

输出:

('key    X', 'value')
('key    X', 'value value')
('key    X', 'value\nvalue\nvalue\nvalue')
('key     ', 'value')
('key     ', '?')
('key     ', '?')