【问题标题】:Take first word after a regex match在正则表达式匹配后取第一个单词
【发布时间】:2019-03-25 19:34:56
【问题描述】:

我正在尝试使用正则表达式从字符串中提取一些子字符串。我的函数中有一个单词作为参数,目标是在匹配后提取下一个单词(我对单词的定义)。我尝试了lookbehind和其他一些逻辑,但我未能获得结果,因此欢迎任何帮助。

例如,给定第一种情况,我在函数中输入:**THttpServer**

23:25:04.805: INFO: THttpServer: transportTCPChanged(state: DISCONNECTED 2)
23:25:13.120: INFO: THttpServer: transportUDPOpened(state: Port 54)

预期结果:transportTCPChangedtransportUDPOpened 对于这两种情况。

另一种情况,我输入 CurrentUserConnection

23:25:16.622: INFO: CurrentUserConnection#1:RQ : subscribed(userID: 1)
23:25:16.622: INFO: CurrentUserConnection#8:RP : disconnected

预期结果:subscribed, disconnected

我在 Notepad++ 上尝试过的事情(后视会根据示例而变化):

(?<=THttpServer)(\w+) : 没有匹配 (?<=THttpServer)(.*) : 明显返回所有句子,不是预期匹配

我有点困惑,也许这根本不可能?还是我需要一些预处理?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您需要在THttpServer 之后匹配: 以及直到该单词的任何非单词字符并匹配并捕获它与(\w+)

    例如你可以使用

    THttpServer:\W*(\w+)
    

    请参阅regex demo

    详情

    • THttpServer: - 文字子字符串
    • \W* - 任何 0+ 个非单词字符
    • (\w+) - 捕获组 1(稍后可通过 m.group(1) 访问):1 个或多个单词字符。

    Python demo

    import re
    strs = ['23:25:04.805: INFO: THttpServer: transportTCPChanged(state: DISCONNECTED 2)',
            '23:25:13.120: INFO: THttpServer: transportUDPOpened(state: Port 54)']
    
    rx = re.compile(r'THttpServer:\W*(\w+)')
    for s in strs:
        m = rx.search(s)
        if m:
            print("Found '{}' in '{}'.".format(m.group(1), s))
    

    输出:

    Found 'transportTCPChanged' in '23:25:04.805: INFO: THttpServer: transportTCPChanged(state: DISCONNECTED 2)'.
    Found 'transportUDPOpened' in '23:25:13.120: INFO: THttpServer: transportUDPOpened(state: Port 54)'.
    

    【讨论】:

    • 我正在尝试这样做,但至少使用 Notepad++ 无法正常工作。我喜欢在 python 上实现之前对其进行测试,你知道为什么吗?
    • @AlejandroA 我不知道“不工作”是什么意思。我建议的正则表达式同样适用于 Python re 和 NPP Boost 正则表达式库。提示:始终在兼容环境中测试你的正则表达式。例如,在 regex101.com,您可以设置 Python 选项并在那里测试您的模式。 even generates the code 给你。
    • 按照你的建议在 python 上运行,非常感谢
    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多