Python 正则表达式捕获括号中的文本,省略可选前缀
我正在尝试转换一些文档(Wikipedia文章),其中包含带有特定降价约定的链接。我想使这些是没有链接的读者友好。公约是:Python 正则表达式捕获括号中的文本,省略可选前缀,python,regex,Python,Regex,我正在尝试转换一些文档(Wikipedia文章),其中包含带有特定降价约定的链接。我想使这些是没有链接的读者友好。公约是: 应忽略管道和前面的文本以及括号,捕获模式为[[Article Name | Display Name]]]的双括号中的名称: 显示名称 模式的双括号中的名称应为 不带括号捕获:文章名称 嵌套方法(产生所需结果) 我知道我可以在嵌套的re.sub()表达式中处理#1和#2。例如,这就是我想要的: s = 'including the [[Royal Danish Academ
[[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})[^ |]+
或与]匹配的位置除外。]
按字面意思匹配\\\\\\\
将以下内容捕获到捕获组1中((?:(?!]{2})[^ |]+)
对任何字符进行一次或多次匹配,但(?:(?!]{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}