我如何打印正则表达式的部分

时间:2019-07-13 14:10:34

标签: python regex

我无法打印匹配的正则表达式的组件。

我正在学习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)为什么将组(1)打印为“ 6 | 27 27 27 |” ?我希望(.*\n)*尽可能地贪婪,以便它消耗1-6行中的所有内容,而使text_to_search的最后一行与group(2)相匹配,但似乎(.*\n)*花费了仅第6行。这是为什么?为什么在打印组(1)时没有打印第1-5行?
3)我试图通过regex tutorial进行尝试,但是未能理解(?...)的那些技巧。如何验证最后一行中的数字是否相等(所以27 27 27可以,但是21 27 27不能)?

1 个答案:

答案 0 :(得分:1)

1)print(match)仅显示对象的轮廓。 matchSRE_Match object,因此,要从中获取信息,您需要执行类似match.group(0)的操作,即访问存储在对象中的值。

2)要捕获第1-6行,您需要根据this regex tester(.*\n)*更改为((?:.*\n)*)

  

重复捕获组将仅捕获最后一次迭代。在重复的组周围放置一个捕获组以捕获所有迭代,或者如果您对数据不感兴趣,则使用非捕获组

3)要匹配特定数字,您需要使其更具体,并在末尾将这些数字包括在单独的组中。