用于捕获两个正则表达式模式之间的 n 行文本的正则表达式
Regular expression to capture n lines of text between two regex patterns
需要正则表达式方面的帮助才能准确地抓取两个正则表达式匹配项之间的 n 行文本。例如,我需要 17 行文本,我使用了下面的示例,但它不起作用。我
请参阅下面的示例代码:
import re
match_string = re.search(r'^.*MDC_IDC_RAW_MARKER((.*?\r?\n){17})Stored_EGM_Trigger.*\n'), t, re.DOTALL).group()
value1 = re.search(r'value="(\d+)"', match_string).group(1)
value2 = re.search(r'value="(\d+\.\d+)"', match_string).group(1)
print(match_string)
print(value1)
print(value2)
我在这里添加了一个示例字符串,因为 SO 不允许长代码字符串:
https://hastebin.com/aqowusijuc.xml
您得到误报是因为您使用了 re.DOTALL 标志,它允许 .
字符匹配换行符。也就是说,当您匹配 ((.*?\r?\n){17})
时,.
可能会吃掉许多额外的换行符来满足您需要的 17 个字符。您现在也意识到 \r
是多余的。另外,用 ^.*?
开始你的正则表达式是多余的,因为你强制搜索从头开始,然后说搜索引擎应该跳过尽可能多的字符来找到 MDC_IDC_RAW_MARKER
。因此,一个简化且正确的正则表达式是:
match_string = re.search(r'MDC_IDC_RAW_MARKER.*\n((.*\n){17})Stored_EGM_Trigger.*\n', t)
需要正则表达式方面的帮助才能准确地抓取两个正则表达式匹配项之间的 n 行文本。例如,我需要 17 行文本,我使用了下面的示例,但它不起作用。我
请参阅下面的示例代码:
import re
match_string = re.search(r'^.*MDC_IDC_RAW_MARKER((.*?\r?\n){17})Stored_EGM_Trigger.*\n'), t, re.DOTALL).group()
value1 = re.search(r'value="(\d+)"', match_string).group(1)
value2 = re.search(r'value="(\d+\.\d+)"', match_string).group(1)
print(match_string)
print(value1)
print(value2)
我在这里添加了一个示例字符串,因为 SO 不允许长代码字符串: https://hastebin.com/aqowusijuc.xml
您得到误报是因为您使用了 re.DOTALL 标志,它允许 .
字符匹配换行符。也就是说,当您匹配 ((.*?\r?\n){17})
时,.
可能会吃掉许多额外的换行符来满足您需要的 17 个字符。您现在也意识到 \r
是多余的。另外,用 ^.*?
开始你的正则表达式是多余的,因为你强制搜索从头开始,然后说搜索引擎应该跳过尽可能多的字符来找到 MDC_IDC_RAW_MARKER
。因此,一个简化且正确的正则表达式是:
match_string = re.search(r'MDC_IDC_RAW_MARKER.*\n((.*\n){17})Stored_EGM_Trigger.*\n', t)