5

我的字符串包含名称,有时在字符串中包含用户名,后跟日期时间戳:

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

4 回答 4

2

您可能会得到所有文本,直到第一次出现-+digits+ -

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

如果数字必须恰好是 4 位数字(例如,如果是一年),则替换+{4}

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

查看正则表达式演示

细节

  • ^- 字符串的开始
  • .*?- 除换行符以外的任何 0+ 字符,尽可能少
  • (?=-\d+-)- 直到第一次出现-and 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'
于 2020-04-11T10:11:40.060 回答
1

我建议去掉你不想要的尾随内容,留下你想要的:

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

这打印:

GN1RLWFH0546

请参阅下面的正则表达式演示。

演示

于 2020-04-11T10:14:09.183 回答
0

下面的正则表达式怎么样:(.*)-\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)) 
于 2020-04-11T10:18:59.993 回答
0
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())
于 2020-04-11T10:23:02.253 回答