Извлечь имя в текстовом файле между (: или, или;) и (ключевым словом) с помощью регулярного выражения в python

1
# 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.

  • 0
    Ты можешь попробовать это? obj = re.compile (r '\ s * ([^:] *?) (? <! \ w) (?: {})'. format ('|' .join (Keywords_cap)))
  • 0
    Вы хотите извлечь подстроку между : / , / ; / . и слово из keywords_cap ?
Теги:
path
keyword

1 ответ

0

Сначала вы можете совместить начальную границу с [:,;.], Затем потреблять любые пробелы и необязательный " 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.
  • 0
    Если слова ключевого слова повторяются в моем файле более одного раза, как я могу получить только первый результат?
  • 0
    @AnnC Вы имеете в виду, что вам нужно получить только первый матч? Смотрите это демо . Используйте m = obj.search(mensaje) чтобы получить первый объект данных соответствия, и, if m: чтобы увидеть, является ли совпадение успешным, то m.group(1) значение Group 1 с помощью m.group(1) .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню