多行字符串匹配器,可选插入短语

时间:2018-08-05 12:14:25

标签: python regex multiline formatted-input

我想获取分布在两行之间的文本。

例如:

try:
    main()
except Exception as e:
    clean_up_stuff()  #this one never called if keyboard interrupt in module urllib3 thread
finally: #but this work
    clean_up_stuff() 

我想获得 PO号4000813852 就像基于表的数据一样,但是在整个文档的上下文中,它们似乎是普通文本。

我像PO Number Dept.number 4000813852 7 一样使用re.MULTILINE

在这种情况下它可以工作,但这不是最佳解决方案,因为 PO号可能位于

的中间
r'PO Number.*\n[0-9]+'

2 个答案:

答案 0 :(得分:2)

您可以在两个捕获组和启用re.DOTALL选项的情况下执行此操作。该表达式假定您感兴趣的数字是文本中唯一的10位数字。

表达式是:

(PO\sNumber).*(\d{10})

Python代码段:

import re

first_string = """PO Number Dept.number
4000813852 7"""

second_string = """Invoice Number PO Number Dept.number
123456666     4000813853  7"""

PO_first = re.search(r'(PO\sNumber).*(\d{10})',first_string,re.DOTALL)
print(PO_first.group(1)+" "+PO_first.group(2))

PO_second = re.search(r'(PO\sNumber).*(\d{10})',second_string,re.DOTALL)
print(PO_second.group(1)+" "+PO_second.group(2))

输出:

PO Number 4000813852
PO Number 4000813853

答案 1 :(得分:1)

使用单个正则表达式:

data="""PO Number Dept.number
    4000813852 7
    Invoice Number PO Number Dept.number
    123456666     4000813852  7
    """

re.findall(r"(PO Number)\s*Dept.number\s*(?:(?:\d+)\s+(\d+)|(\d+))\s+\d",data)
Out: 
[('PO Number', '', '4000813852'), ('PO Number', '4000813852', '')]

我不使用re.MULTILINE,因为\ s也与换行符匹配。