regex Python正则表达式提取数字之间的文本

31moq8wy  于 2023-04-13  发布在  Python
关注(0)|答案(2)|浏览(155)

我想提取数字之间的文本。例如,如果有如下文本

1964 ORDINARY shares
EXECUTORS OF JOANNA C RICHARDSON
100 ORDINARY shares 
TG MARTIN
C MARTIN
7500 ORDINARY shares 
ARCO LIMITED

我想产生一个3个元素的列表,其中每个元素是数字之间的文本,包括第一个数字,但没有结束数字,以及列表中没有结束数字的最后一个元素

[
'1964 ORDINARY shares \nEXECUTORS OF JOANNA C RICHARDSON',
'100 ORDINARY shares \nTG MARTIN\nC MARTIN\n',
'7500 ORDINARY shares\nARCO LIMITED'
]

我试过这么做

regex = r'\d(.+?)\d
re.findall(regex, a, re.DOTALL)

但它又回来了

['9',
 ' ORDINARY shares\nEXECUTORS OF JOANNA C RICHARDSON\n',
 '0 ORDINARY shares\nTG MARTIN\nC MARTIN\n',
 '0']
qcbq4gxm

qcbq4gxm1#

你可以使用下面的代码来实现这一点。

import re

text = """1964 ORDINARY shares
EXECUTORS OF JOANNA C RICHARDSON
100 ORDINARY shares 
TG MARTIN
C MARTIN
7500 ORDINARY shares 
ARCO LIMITED"""

# Use regex to find the text between digits
pattern = r'\d+.*?(?=\d|$)'
matches = re.findall(pattern, text, flags=re.DOTALL)

print(matches)
uidvcgyl

uidvcgyl2#

模式\d(.+?)\d匹配至少3个字符,其中外部2个数字匹配,内部部分在组1中捕获(其中(.+?)匹配至少1个字符)
您会得到这些结果是因为您正在使用带有re.findall的捕获组,它返回捕获组的值。
例如,在1964中,您匹配196,其中9在组1中捕获,并且这是结果中的第一个值。
markalex有一个被否决和删除的答案,Michael Butscher有一个注解,它们包含一个键,可以使用一个没有re.DOTALL和一个非贪婪量词的模式。

\b\d+\b\D*

说明

  • \b\d+\b匹配字边界之间的1+位,以防止部分字匹配
  • \D*匹配除数字以外的可选字符,包括换行符

Regex demo|Python demo
如果匹配应该从字符串的开头开始,并且后面跟着一个空格字符,那么您也可以考虑对多行使用带有re.M的锚。

^\d+\s\D*

Regex demo|Pyton demo

相关问题