2 回答
![?](http://img1.sycdn.imooc.com/54586870000183e302200220-100-100.jpg)
TA贡献1862条经验 获得超7个赞
您可以使用
(?<!\w)(your|escaped|keywords|here)\W*([A-Z]*\d+(?:-+[A-Z]*\d+)*)
请参阅正则表达式演示。
图案详情
(?<!\w)
- 左字边界(明确,\b
含义取决于上下文,如果下一个字符是非字字符,则左侧需要一个字字符,这不是用户通常期望的)(your|escaped|keywords|here)
-捕获组1:您的关键字列表,可以很容易地使用内置'|'.join(map(re.escape,my_list))
(注意re.escape
是必要的转义特殊的正则表达式的元字符像.
,+
,(
,[
,等)\W*
- 0+ 个非单词字符(字母、数字或 以外的字符_
)([A-Z]*\d+(?:-+[A-Z]*\d+)*)
- 捕获组 2:-+
- 一个或多个连字符[A-Z]*\d+
- 零个或多个大写 ASCII 字母,1 个或多个数字[A-Z]*
- 零个或多个大写 ASCII 字母\d+
- 1 位或更多位(?:-+[A-Z]*\d+)*
- 0 次或多次重复
请参阅Python 演示:
import re
s="""your_text_here"""
my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien']
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')]
![?](http://img1.sycdn.imooc.com/545865470001bf9402200220-100-100.jpg)
TA贡献2016条经验 获得超9个赞
确实需要有一些东西允许少于 50 多个代表点的用户发表评论,因为这个线程是我真的很好奇并且想要分叉的线程,但不想给出一个完整的答案上,因为我给出的答案涉及有限的情况并且不灵活。
@Wiktor Stribiżew
您的解决方案错过了“参考”。基于您的演示的输出部分。看起来他想跳过“tramite”
@checkmate
在您想要的输出中,您需要对其进行编辑,因为“UV1234”不会出现在您发布的字符串中的任何位置
.
无论如何,我找到了一个解决方案,但我真的希望有人可以改进这一点。
>>> 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')]
缺陷:
为了正确捕获它部分依赖于“Ref.(?!:[\S\s]{,11}Expedien)”
首先,需要编辑“11”以考虑可能存在的其他长度的信息,因此它不灵活
其次,如果后面是“参考”而不是第三个“参考”。将被错误地捕获
添加回答
举报