【发布时间】:2019-07-13 22:41:19
【问题描述】:
我无法打印匹配的正则表达式的组件。
我正在学习 python3,我需要验证我的命令输出是否符合我的需求。我有以下短代码:
#!/usr/bin/python3
import re
text_to_search = '''
1 | 27 23 8 |
2 | 21 23 8 |
3 | 21 23 8 |
4 | 21 21 21 |
5 | 21 21 21 |
6 | 27 27 27 |
7 | 27 27 27 |
'''
pattern = re.compile('(.*\n)*( \d \| 2[17] 2[137] [ 2][178] \|)')
matches = pattern.finditer(text_to_search)
for match in matches:
print (match)
print ()
print ('matched to group 0:' + match.group(0))
print ()
print ('matched to group 1:' + match.group(1))
print ()
print ('matched to group 2:' + match.group(2))
以及以下输出:
<_sre.SRE_Match object; span=(0, 140), match='\n 1 | 27 23 8 |\n 2 | 21 23 8 |\n 3 >
matched to group 0:
1 | 27 23 8 |
2 | 21 23 8 |
3 | 21 23 8 |
4 | 21 21 21 |
5 | 21 21 21 |
6 | 27 27 27 |
7 | 27 27 27 |
matched to group 1: 6 | 27 27 27 |
matched to group 2: 7 | 27 27 27 |
请解释一下:
1)为什么“打印(匹配)”只打印匹配的开头,如果它大于某个阈值,它是否有某种限制来修剪输出?
2) 为什么 group(1) 打印为“6 | 27 27 27 |” ?我希望(.*\n)* 尽可能贪婪,所以它消耗了 1-6 行的所有内容,留下text_to_search 的最后一行与group(2) 匹配,但似乎(.*\n)* 只占用了第 6 行。这是为什么?为什么打印 group(1) 时不打印第 1-5 行?
3) 我试图通过regex tutorial,但未能理解(?...) 的这些技巧。如何验证最后一行中的数字是否相等(所以27 27 27 可以,但21 27 27 不行)?
【问题讨论】:
-
你想要得到什么?每行作为一个组?至于你的第二点:重复的捕获组只会捕获最后一次迭代。在重复组周围放置一个捕获组以捕获所有迭代
-
您是否尝试过使用任何在线正则表达式测试器/工具分析您的模式?
-
您可能应该问三个不同的问题 - 这不是讨论论坛或教程。问题 2 在 SO 上可能有重复。
-
也适用于第二季度:regexp group repetition in python]