从字符串中提取 usernames/names 的正则表达式
Regex to extract usernames/names from a string
我有包含名称的字符串,有时在字符串中包含用户名,后跟日期时间戳:
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))
您可能会得到第一次出现 -
+digits+-
:
之前的所有文本
^.*?(?=-\d+-)
如果数字必须正好是 4 位数字(比如,如果是年份),则将 +
替换为 {4}
:
^.*?(?=-\d{4}-)
详情
^
- 字符串开头
.*?
- 除换行字符外的任何 0+ 个字符,尽可能少
(?=-\d+-)
- 直到第一次出现 -
和 1+ 位数字(或者,如果使用 \d{4}
,正好是四位数字),然后是 -
(这部分不会添加到匹配值中,因为正先行是一种非消耗模式。
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'
我建议去掉你不想要的尾随内容,留下你想要的:
inp = "GN1RLWFH0546-2020-04-10-18-09-52-563945.txt"
out = re.sub(r'-\d{4}-\d{2}-\d{2}.*$', '', inp)
print(out)
这会打印:
GN1RLWFH0546
请参阅下面的正则表达式演示。
下面的正则表达式如何:(.*)-\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))
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())
我有包含名称的字符串,有时在字符串中包含用户名,后跟日期时间戳:
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))
您可能会得到第一次出现 -
+digits+-
:
^.*?(?=-\d+-)
如果数字必须正好是 4 位数字(比如,如果是年份),则将 +
替换为 {4}
:
^.*?(?=-\d{4}-)
详情
^
- 字符串开头.*?
- 除换行字符外的任何 0+ 个字符,尽可能少(?=-\d+-)
- 直到第一次出现-
和 1+ 位数字(或者,如果使用\d{4}
,正好是四位数字),然后是-
(这部分不会添加到匹配值中,因为正先行是一种非消耗模式。
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'
我建议去掉你不想要的尾随内容,留下你想要的:
inp = "GN1RLWFH0546-2020-04-10-18-09-52-563945.txt"
out = re.sub(r'-\d{4}-\d{2}-\d{2}.*$', '', inp)
print(out)
这会打印:
GN1RLWFH0546
请参阅下面的正则表达式演示。
下面的正则表达式如何:(.*)-\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))
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())