首页 > 解决方案 > 查找逗号和关键字列表之间的单词 RegEx

问题描述

我有一个大文本。我想找到楼主的地址。我的输入类似于...

输入:(...) seiscientos catorce guión ocho, domiciliado en calle Santillana número trescientos sesenta y nueve, Valle Lo Campino, comuna de Quilicura, Región Metropolitana, constituyeron una sociedad 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 Santillana número trescientos sesenta y nueve

出了点问题,因为我想提取关键字的一个单词和下一个逗号 (,) 或下一个点 (.) 之间的文本。

但是被提取是因为这个关键字列表只到了下一个点(.)。

有人可以帮我解决这个愚蠢的问题吗?

标签: regexcompilationkeyword

解决方案


(.*?)\.模式匹配除换行符之外的任何字符,在最左边的字符之前尽可能少.。它可以“转换”为([^.]*),一个匹配 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*([^.,]*)

请参阅正则表达式演示


推荐阅读