在由字和数字组成的匹配字符串的特定模式之后获取一个存在的数字

时间:2019-03-18 17:46:41

标签: python regex string-matching

这是输入字符串:

text Expedien N0 18-00232995
$cat input_file
some text before Expedien: 1-21-212-16-26 some random text
Reference RE9833 of all sentences.
abc
123
456
something blah blah Ref.: 
tramite  1234567
Ref.:
some junk Expedien N° 18-00777 # some new content
some text Expedien N°18-0022995 # some garbled content

对于其他字符串: 这段代码有效,但是我也想获取一个单词是否由数字组成并且我想在匹配之后找到该数字(单词-数字在列表中作为一个实体出现),因此在这种情况下:

获取输出('Expedien','N0'),但预期输出为('Expedien N0','18 -00232995')。

获取其他实体的代码如下:

import re
s="""your_text_here"""
my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien', 'Expedien N0']
rx = r'(?<!\w)({})\W*([A-Z]*\d+(?:-+[A-Z]*\d+)*)'.format('|'.join(map(re.escape,my_list)))
print(re.findall(rx, s))

输出:

[('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('tramite', '1234567'), ('Expedien N°', '18-00777'), ('Expedien N°', '18-0022995')]

如何通过操纵上述正则表达式来获取(“ Expedien N0”,“ 18-00232995”)此输出

1 个答案:

答案 0 :(得分:1)

您需要进行一些小的更改才能获得所需的输出。在您的

my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien', 'Expedien N0']

您在Expedien之前指定了Expedien N0,这是因为text Expedien N0 18-00232995中的文本ExpedienN0在第二组中匹配,并且没有匹配范围{ {1}},稍后再说。因此,如果您只是更改列表中的顺序并将Expedien N0放在Expedien N0之前,那么Expedien会与第一组匹配,而Expedien N0将在第二组中被捕获,并为您提供所需的结果。检查下面修改过的python代码,

18-00232995

打印

import re
s="""text Expedien N0 18-00232995
$cat input_file
some text before Expedien: 1-21-212-16-26 some random text
Reference RE9833 of all sentences.
abc
123
456
something blah blah Ref.: 
tramite  1234567
Ref.:
some junk Expedien N° 18-00777 # some new content
some text Expedien N°18-0022995 # some garbled content"""
my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien N0', 'Expedien']

rx = r'(?<!\w)({})\W*([A-Z]*\d+(?:-+[A-Z]*\d+)*)'.format('|'.join(map(re.escape,my_list)))
print(rx)
print(re.findall(rx, s))