【问题标题】:Regex works alone but not when used in groups正则表达式单独工作,但在组中使用时不起作用
【发布时间】:2022-01-18 13:19:49
【问题描述】:

主要问题是当我尝试创建由不同组组合的正则表达式时,我可以获得每个组的值。

我有一个这样的字符串:

some text here en Value1 (VALUE2)

我想创建一个正则表达式来获取三个子字符串:

  1. some text here。是字符串开头和单词en 之间的所有内容。
  2. Value1。是en 和第一个( 之间的文本。
  3. Value2。是()之间的文字。

我搜索了有关群组的信息并阅读了:

它们是通过将要分组的字符放在一组括号 (, ) 中来创建的。

括号 () 中的任何内容都是捕获组。

我们可以指定任意数量的组。一对括号内的每个子模式将被捕获为一个组。

所以我假设我需要一个包含三个组的正则表达式(即三个 (),其中每个括号都包含每个案例的正则表达式)。

所以我的想法是:查找您需要的每个正则表达式,并与 () 一起添加以创建组。所以我对这些组使用了这些正则表达式:

  1. 第一组:.+?(?= en)example
  2. 第二组:(?<=en\s).*?(?=\s\()example
  3. 第三组:(?<=\().+?(?=\))example

但是当我一起尝试所有正则表达式时:

(.+?(?= en))((?<=en\s).*?(?=\s\())((?<=\().+?(?=\)))

它没有得到组。实际上它没有找到任何组(example)。

我不知道我是否遗漏了有关在正则表达式中使用组的某些内容,但我无法做到这一点。

另外,我的python代码是:

import re

str = "some text here en Value1 (VALUE2)"
result = re.search(r"(.+?(?= en))((?<=en\s).*?(?=\s\())((?<=\().+?(?=\)))", str)

print(result.groups())

是的,我知道我可以遍历字符串并获取值,但如果可能的话,我想用regex 来做。

提前致谢。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    你可以使用

    ^(.*?)\s+en\s+(.*?)\s+\(([^()]*)\)
    

    如果VALUE1 始终是一大块非空白字符,您可以使用

    ^(.*?)\s+en\s+(\S+)\s+\(([^()]*)\)
    #              ^^^
    

    如果模式必须匹配整个字符串:

    ^(.*?)\s+en\s+(\S+)\s+\(([^()]*)\)$
    

    请参阅regex demo

    Python demo

    import re
    text = "some text here en Value1 (VALUE2)"
    result = re.search(r"^(.*?)\s+en\s+(.*?)\s+\(([^()]*)\)", text)
    print(result.groups())
    # => ('some text here', 'Value1', 'VALUE2')
    

    详情

    • ^ - 字符串开头
    • (.*?) - 第 1 组:除换行符之外的任何零个或多个字符尽可能少
    • \s+en\s+ - en 用一个或多个空格括起来
    • (.*?) - 第 2 组:除换行符之外的任何零个或多个字符尽可能少
    • \s+ - 一个或多个空格
    • \( - 一个 ( 字符
    • ([^()]*) - 第 3 组:除 () 之外的任何零个或多个字符(如果可能有任何字符并且您希望匹配到最右边的 ),请替换为 .*
    • \) - 一个 ) 字符。

    【讨论】:

    • 非常感谢,它运行良好。
    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2019-10-22
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多