Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式捕获括号中的文本,省略可选前缀_Python_Regex - Fatal编程技术网

Python 正则表达式捕获括号中的文本,省略可选前缀

Python 正则表达式捕获括号中的文本,省略可选前缀,python,regex,Python,Regex,我正在尝试转换一些文档(Wikipedia文章),其中包含带有特定降价约定的链接。我想使这些是没有链接的读者友好。公约是: 应忽略管道和前面的文本以及括号,捕获模式为[[Article Name | Display Name]]]的双括号中的名称: 显示名称 模式的双括号中的名称应为 不带括号捕获:文章名称 嵌套方法(产生所需结果) 我知道我可以在嵌套的re.sub()表达式中处理#1和#2。例如,这就是我想要的: s = 'including the [[Royal Danish Academ

我正在尝试转换一些文档(Wikipedia文章),其中包含带有特定降价约定的链接。我想使这些是没有链接的读者友好。公约是:

  • 应忽略管道和前面的文本以及括号,捕获模式为
    [[Article Name | Display Name]]]
    的双括号中的名称:
    显示名称
  • 模式的双括号中的名称应为 不带括号捕获:
    文章名称
  • 嵌套方法(产生所需结果) 我知道我可以在嵌套的
    re.sub()
    表达式中处理#1和#2。例如,这就是我想要的:

    s = 'including the [[Royal Danish Academy of Sciences and Letters|Danish Academy of Sciences]], [[Norwegian Academy of Science and Letters|Norwegian Academy of Sciences]], [[Russian Academy of Sciences]], and [[National Academy of Sciences|US National Academy of Sciences]].'
    
    re.sub('\[\[(.*?\|)(.*?)\]\]','\\2',         # case 1
           re.sub('\[\[([^|]+)\]\]','\\1',s)     # case 2
    )
    # result is correct:
    'including the Danish Academy of Sciences, Norwegian Academy of Sciences, Russian Academy of Sciences, and US National Academy of Sciences.'
    
    单程方法(此处寻找解决方案) 为了提高效率和我自己的进步,我想知道是否有单通道方法

    我尝试的内容:在可选的组1中,我想贪婪地捕获
    [[
    |
    之间的所有内容(如果存在)。然后在组2中,我想捕获
    ]
    之前的所有内容。然后我只想返回第2组

    我的问题是使贪婪捕获成为可选的:

    re.sub('\[\[([^|]*\|)?(.*?)\]\]','\\2',s)
    # does NOT return the desired result:
    'including the Danish Academy of Sciences, Norwegian Academy of Sciences, US National Academy of Sciences.'
    # is missing: 'Russian Academy of Sciences, and '
    

    • \[{2}
      匹配
      [[
    • (?:(?:(?!]{2})[^ |]+\|)*
      匹配以下任意次数
      • (?:(?!]{2})[^ |]+
        对任何字符进行一次或多次匹配,但
        或与
        ]匹配的位置除外。]
      • \\\\\\\
        按字面意思匹配
    • ((?:(?!]{2})[^ |]+)
      将以下内容捕获到捕获组1中
      • (?:(?!]{2})[^ |]+
        对任何字符进行一次或多次匹配,但
        或与
        ]匹配的位置除外。]
    • ]{2}
      匹配
      ]]
    更换
    \1

    结果:

    including the Danish Academy of Sciences, Norwegian Academy of Sciences, Russian Academy of Sciences, and US National Academy of Sciences.
    
    另一个可能对你有用的选择是以下。它没有上面的正则表达式那么具体,但不包括任何lookarounds

    \[{2}(?:[^]|]+\|)*([^]|]+)]{2}
    

    那怎么办?我想那是可行的,如果你想回答的话,那就去吧。我感兴趣的是,这件事是否可以不用回头看或回头看。看起来嵌套的子类会更快,但需要进行测试。您是否想过使用python库在html标记中转换wiki标记-克里奥尔标记?我补充了一个答案。我还在答案中添加了第二个正则表达式,如果您愿意,它不使用lookarounds,但它没有那么具体。我的意思是,如果字符串中包含
    ]
    ,它将停止在那里(而不是
    ]
    )@Lupanoide我不知道这是一件事——谢谢。是的,我正在寻找的是另一种选择。它起作用(我的尝试没有起作用)的一个原因是,它还从可选前缀中排除了右括号和管道。谢谢
    \[{2}(?:[^]|]+\|)*([^]|]+)]{2}