在逗号和关键字列表RegEx

时间:2018-08-31 08:46:01

标签: regex compilation keyword

我有一个大文本。我想找到所有者的地址。我的输入就像...

  

输入:(...)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

这是错误的,因为我想提取一个关键词关键字与下一个逗号(,)或下一个点(。)之间的文本。

但是提取是因为此关键字列表仅到下一个点(。)。

有人可以帮我解决这种愚蠢吗?

1 个答案:

答案 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