【问题标题】:python regex find values with newline character alsopython 正则表达式也用换行符查找值
【发布时间】:2019-05-10 11:46:11
【问题描述】:

我正在解决这个我无法解决的正则表达式问题。我做的正则表达式

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 ', '?')

我希望输出看起来像

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

【问题讨论】:

  • 锚定在开头并使前两个模式可选 - ^(?:\[(.*?)]\s+)?(.*),请参阅 regex101.com/r/h3wwUa/1
  • @WiktorStribiżew 感谢您的回复。我可能没有正确解释它 - 从您提供的链接中,我正在寻找第 4、5、6 行中的“值”作为匹配 3 的一部分
  • 你应该在问题中解释它,请编辑它。 message 是单个字符串变量吗?
  • 是的,消息是一个字符串。
  • 试试re.findall(r'^\[([^][]*)]\s+(.*(?:\n(?!\[[^][]*]).*)*)', message, re.M)

标签: python regex


【解决方案1】:

你可以使用

(?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     ', '?')

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 2015-04-27
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多