# coding=utf-8
import re
f = open('/Users/.../example.txt')
mensaje = f.read()
mensaje = mensaje.replace("\n","")
keywords_cap = ['SpA','SPA','LIMITADA','LTDA','S.A.']
keywords_cap = map(re.escape, keywords_cap)
keywords_cap.sort(key=len, reverse=True)
obj = re.compile(r'\s*([^:]*)(?<!\w)(?:{})'.format('|'.join(keywords_cap)))
print("COMPANY NAME: %s" % obj.findall(mensaje))
У меня есть разные файлы, содержащие :
или ;
, название компании и одно слово, определенное в keywords_cap
.
Файл содержит:
Nombre o razón social: "MJ FACILITIES SERVICES SpA nombre de fantasía MJ SpA."
Теперь мой вывод:
MJ FACILITIES SERVICES SpA nombre de fantasía
и я хочу только MJ FACILITIES SERVICES SpA
.
Сначала вы можете совместить начальную границу с [:,;.]
, Затем потреблять любые пробелы и необязательный "
char to" ltrim "результат (с помощью \s*"?
), Затем сопоставлять и захватывать любые символы 0+ other чем те ограничители, насколько это возможно, вплоть до одного из ваших keywords_cap
:
obj = re.compile(r'[:,;.]\s*"?([^:,;.]*?(?<!\w)(?:{}))'.format('|'.join(keywords_cap)))
См. Демонстрацию Python и демо-версию regex.
подробности
[:,;.]
- это :
, ,
, ;
или .
\s*
- 0+ символы пробела"?
- необязательный "
([^:,;.]*?(?<!\w)(?:{}))
- Захват группы 1 (это будет возвращать re.findall
): [^:,;.]*?
- любые ноль или больше символов, кроме :
, ,
, ;
, и .
, как можно меньше (*?
- ленивый квантор)(?<!\w)
- не разрешено левое слово слева(?:{})
- группа чередования с экранированными элементами keyword_cap
.m = obj.search(mensaje)
чтобы получить первый объект данных соответствия, и, if m:
чтобы увидеть, является ли совпадение успешным, то m.group(1)
значение Group 1 с помощью m.group(1)
.
:
/,
/;
/.
и слово изkeywords_cap
?