【问题标题】:Regex to extract usernames/names from a string正则表达式从字符串中提取用户名/名称
【发布时间】:2020-07-24 01:46:54
【问题描述】:

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

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))

【问题讨论】:

  • 你有没有想过先计算时间戳然后减去模式来获得用户名?

标签: python regex re


【解决方案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())

【讨论】:

    【解决方案2】:

    下面的正则表达式怎么样:(.*)-\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)) 
    

    【讨论】:

      【解决方案3】:

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

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

      打印出来:

      GN1RLWFH0546
      

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

      Demo

      【讨论】:

        【解决方案4】:

        您可以获得直到第一次出现-+digits+-的所有文本:

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

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

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

        regex demo

        详情

        • ^ - 字符串开头
        • .*? - 除换行符之外的任何 0+ 字符,尽可能少
        • (?=-\d+-) - 直到第一次出现 - 和 1+ 位(或者,如果使用 \d{4},则正好是四位),然后是 -(这部分不会作为正向前瞻添加到匹配值中是一种非消耗模式)。

        Python demo:

        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'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-08
          相关资源
          最近更新 更多