0

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

例如 :

PO Number Dept.number
4000813852 7

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

re.MULTILINE用过 r'PO Number.*\n[0-9]+'

它在这种情况下有效,但它不是最好的解决方案,因为可能PO 编号位于中间

Invoice Number PO Number Dept.number
123456666     4000813852  7
4

2 回答 2

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
于 2018-08-05T17:23:10.190 回答
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 也匹配换行符。

于 2018-08-05T20:36:59.200 回答