首先,我要求@checkmate解决这个问题,因为发布的解决方案并没有准确地满足他在“预期输出”中发布的内容。我不确定他是不注意还是只是错误地发布,但是准确地解决这个问题确实可以帮助我实现我的个人项目:Get number present after a particular pattern of a matching string in Python
在他的预期输出中他发布:
这是预期的输出:
样本输出:
{'Ref.': 'UV1234'} {'Expedien N°': '18-0022995'} {'Expedien N°': '18-0022995'} {'Expedien': '1-21-212-16-26'} {'Reference' : 'RE9833'}
请注意,"tramite"
在他的“预期输出”中被明确忽略。另请注意,他在"{'Ref.': 'UV1234'}"
行错误地发布了他的预期输出,因为'UV1234'
从未出现在字符串中。我认为他的意思是"{'Ref.': '1234567'}"
。是的,我试过和他们聊天,但没有运气。
.
作为回应,我提出了一个超特定的解决方案,跳过"tramite"
,但只有轻微的变化程度,正则表达式将被打破。另外,因为有"Ref.:"
的线存在,然后"Expedien N° [Numbers]"
编辑到正则表达式产量"Ref."
被捕获,而"[Numbers]"
和"Expedien N°"
被忽略,而不是"Expedien N° [Numbers]"
(这个有缺陷的变体的一个例子如下)。我更喜欢使用"re.findall"
,但我很清楚它不会递归循环遍历字符串。如果我只能通过"re.search"
获得下面的内容,我仍然需要弄清楚如何解决这个问题。
Get number present after a particular pattern of a matching string in Python
>>> import re
>>> string = '''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'''
>>> re.findall('(?:(Expedien[\s]+N\S|Ref\.(?!:[\S\s]{,11}Expedien)|Reference|Expedien))[\S\s]*?([A-Z\-]*(?:[\d]+)[\S]*)', string)
[('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('Ref.', '1234567'), ('Expedien N\xb0', '18-00777'), ('Expedien N\xb0', '18-0022995')]
缺陷:
- 要正确捕捉,它部分取决于“参考。(?!:[\ S \ s] {,11} Expedien)”
- 首先,需要编辑“11”以说明捕获组之间可能存在的其他信息长度,我无法弄清楚,所以现在它不灵活
- 其次,如果在字符串中需要捕获的是“参考”或我的另一个术语列表,而不是“Expedien”(再次,它太具体),那么第三个“参考”。将被错误捕获
.
.
.
在这个轻微的变体中,我没有指定11的范围并消除"Ref."
的后视,"Ref."
被捕获的数字和"Expedien N°"
应该被捕获而不是"Ref."
,被忽略
>>> re.findall('(?:(Expedien[\s]+N\S|Ref\.|Reference|Expedien))[\S\s]*?([A-Z\-]*(?:[\d]+)[\S]*)', string)
[('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('Ref.', '1234567'), ('Ref.', '18-00777'), ('Expedien N\xb0', '18-0022995')]
.
.
.
所以,我想知道:
如果在我拥有的列表中的一个术语与该列表中存在的另一个术语之间发生所需的查询,如何使正则表达式无法捕获?
.
.
所需的输出如下所示,但我想知道如何更可靠地获得它,因为我上面的内容是超特定的:
[('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('Ref.', '1234567'), ('Expedien N\xb0', '18-00777'), ('Expedien N\xb0', '18-0022995')]
有点长,但这个正则表达式应该对你有负面的前瞻:
(Ref\.:|Reference|Expediente|Expediente No|Expedien N°|Exp\.No|Expedien)\s*(?:(?!Ref\.:|Reference|Expediente|Expediente No|Expedien N°|Exp\.No|Expedien).)*?([A-Z]*\d+(?:-[A-Z]*\d+)*)
(?!...)
是负面的预测,以确保我们不匹配重叠标签。