代码之家  ›  专栏  ›  技术社区  ›  J.F.

Regex单独工作,但在组中使用时不起作用

  •  1
  • J.F.  · 技术社区  · 4 年前

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

    我有这样一个字符串:

    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 如果可能的话。

    提前谢谢。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Wiktor Stribiżew    4 年前

    你可以用

    ^(.*?)\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+ -一个或多个空格
    • \( -a ( 烧焦
    • ([^()]*) -第3组:任何零个或多个字符,而不是 ( ) (替换为 .* 如果有任何字符,您希望匹配到最右边的 ) )
    • \) -a ) 烧焦