Regex для извлечения имен пользователей / имен из строки - PullRequest
5 голосов
/ 11 апреля 2020

Итак, у меня есть строки, которые включают имена и иногда имя пользователя в строке, за которым следует штамп даты и времени

GN1RLWFH0546-2020-04-10-18-09-52-563945.txt
JOHN-DOE-2020-04-10-18-09-52-563946t64.txt
DESKTOP-OHK45JO-2020-04-09-02-27-11-451975.txt

Я хочу извлечь имена пользователей из этой строки.

GN1RLWFH0546
JOHN-DOE   
DESKTOP-OHK45JO

Я пробовал разные шаблоны регулярных выражений, следующие из которых я извлек,

GN1RLWFH0546
DESKTOP
JOHN

Используя следующий шаблон регулярных выражений

names = re.search(r"\(?([0-9A-Za-z]+)\)?", agent_str)
print(names.group(1))

Ответы [ 4 ]

2 голосов
/ 11 апреля 2020

Вы можете получить весь текст вплоть до первого вхождения - + цифры + -:

^.*?(?=-\d+-)

Если число должно быть ровно 4 цифры (скажем, если это год), затем замените + на {4}:

^.*?(?=-\d{4}-)

См. демонстрационную версию regex

Подробности

  • ^ - начало строки
  • .*? - любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • (?=-\d+-) - до первого появления * 1027 цифры * и 1+ (или, если используется \d{4}, ровно четыре цифры), а затем - (эта часть не добавляется к значению совпадения, поскольку положительный результат просмотра является непотребляющим шаблоном).

См. Python демо :

import re
strs = ["GN1RLWFH0546-2020-04-10-18-09-52-563945.txt", "JOHN-DOE-2020-04-10-18-09-52-563946t64.txt", "DESKTOP-OHK45JO-2020-04-09-02-27-11-451975.txt"]
rx = re.compile(r"^.*?(?=-\d+-)")
for s in strs:
  m = rx.search(s)
  if m:
    print("{} => '{}'".format(s, m.group()))

Выход:

GN1RLWFH0546-2020-04-10-18-09-52-563945.txt => 'GN1RLWFH0546'
JOHN-DOE-2020-04-10-18-09-52-563946t64.txt => 'JOHN-DOE'
DESKTOP-OHK45JO-2020-04-09-02-27-11-451975.txt => 'DESKTOP-OHK45JO'
1 голос
/ 11 апреля 2020

Я предлагаю удалить конечный контент, который вам не нужен, оставив позади то, что вы действительно хотите:

inp = "GN1RLWFH0546-2020-04-10-18-09-52-563945.txt"
out = re.sub(r'-\d{4}-\d{2}-\d{2}.*$', '', inp)
print(out)

Это напечатает:

GN1RLWFH0546

См. Демонстрационную версию регулярного выражения ниже.

Демо

0 голосов
/ 11 апреля 2020
import re

agent_str = ["GN1RLWFH0546-2020-04-10-18-09-52-563945.txt", "JOHN-DOE-2020-04-10-18-09-52-563946t64.txt", "DESKTOP-OHK45JO-2020-04-09-02-27-11-451975.txt"]

for sub in agent_str:
    names = re.search(r"([A-Za-z]+[A-Za-z0-9]+)(\-[A-Za-z]+[A-Za-z0-9]+)?", sub)
    print(names.group())
0 голосов
/ 11 апреля 2020

Как насчет следующего регулярного выражения: (.*)-\d{4}-. Это соответствует чему-либо, за которым следуют дефис, четыре цифры и другой дефис.

Используя приведенное выше регулярное выражение, первая группа представляет собой имя пользователя, ala:

import re
agent_str = 'DESKTOP-OHK45JO-2020-04-09-02-27-11-451975.txt'
names = re.search(r'(.*)-\d{4}-', agent_str)
print(names.group(1)) 
...