我有一个大文本。我想找到所有者的地址。我的输入就像...
输入:(...)seiscientos catorceguiónocho,domiciliado en calle Santillananúmerotrescientos sesenta y nueve,瓦尔卢坎皮诺(Valle Lo Campino), 基里库拉区,大都会区,社会构成 por acciones(...)
keywords_cap = ['DOMICILIO:', 'Domicilio:', 'Domicilio', 'DOMICILIO', 'domiciliado en', 'domiciliada en',
'Domiciliado en', 'Domiciliada en']
keywords_cap = map(re.escape, keywords_cap)
keywords_cap.sort(key=len, reverse=True)
obj = re.compile(r'\b(?:{})\s*(.*?)\.'.format('|'.join(keywords_cap)))
obj2 = obj.search(mensaje)
if obj2:
company_name = obj2.group(1)
else:
company_name = "None"
输出:Calle Santillananúmerotrescientos sesenta y nueve
这是错误的,因为我想提取一个关键词关键字与下一个逗号(,)或下一个点(。)之间的文本。
但是提取是因为此关键字列表仅到下一个点(。)。
有人可以帮我解决这种愚蠢吗?
答案 0 :(得分:1)
(.*?)\.
模式匹配除换行符以外的任何其他字符,在最左边的.
字符之前尽可能少。可以将其“转换”为([^.]*)
,这是一个negated character class模式,它与.
以外的0个或更多字符匹配(请注意,与原始模式的唯一区别在于,否定字符类也匹配换行符,在这种情况下是一个很好的功能。
解决方案是将,
添加到字符类中:
obj = re.compile(r'\b(?:{})\s*([^.,]*)'.format('|'.join(keywords_cap)))
^^^^^^^^
正则表达式看起来像
\b(?:DOMICILIO:|Domicilio:|Domicilio|DOMICILIO|domiciliado en|domiciliada en|Domiciliado en|Domiciliada en)\s*([^.,]*)
请参见regex demo。