python中的正则表达式:去掉括号里面有括号
Regular expression in python: removing brackets with brackets inside
我有一个维基词典转储,正在努力寻找合适的正则表达式模式来删除表达式中的双括号。这是表达式的示例:
line = "# Test is a cool word {{source|{{nom w pc|Chantal|Bouchard}}, ''La langue et le nombril'', Presses de l'Université de Montréal (PUM), 2020, p. 174}}."
我希望删除以 {{source|:
开头的所有括号
示例:# Test is a cool word.
我试过像这样使用 re.sub = re.sub("{{source\|.*?}}", "", line )
但是我得到了# Test is a cool word, ''La langue et le nombril'', Presses de l'Université de Montréal (PUM), 2020, p. 174}}.
我也可以再这样写一句话line = "# Test is a cool word {{source|Nicolas|Daniel, Presses de l'Université de Montréal 4}}"
感谢您的帮助!
您可以使用以下正则表达式来获得所需的答案。
\W+{{source\|.*}}
代码将是,
re.sub("\W+{{source\|.*}}", "", line )
除?
外,正则表达式与问题中的正则表达式几乎相同。删除 ?
使其尽可能多地匹配 .
。
此外,要在添加 {{}}
之前删除 space,请添加 \W+
。
您可以安装 PyPi 正则表达式库(在 terminal/console 中键入 pip install regex
并按 ENTER),然后使用
import regex
rx = r"\s*{{source\|(?>[^{}]|({{(?:[^{}]++|(?1))*}}))*}}\s*"
line = "# Test is a cool word {{source|{{nom w pc|Chantal|Bouchard}}, ''La langue et le nombril'', Presses de l'Université de Montréal (PUM), 2020, p. 174}}."
print( regex.sub('', line) )
# => # Test is a cool word.
参见Python demo。
正则表达式是
\s*\{\{source\|(?>[^{}]|(\{\{(?:[^{}]++|(?1))*}}))*}}\s*
参见regex demo。详情:
\s*
- 零个或多个空格
{{source\|
- 文字 {{source|
字符串
(?>[^{}]|({{(?:[^{}]++|(?1))*}}))*
- 零次或多次重复:
[^{}]
- {
和 }
以外的字符
|
- 或
({{(?:[^{}]++|(?1))*}})
- 第 1 组(递归所必需):{{
,除 {{
和 }}
之外的任何一个或多个字符出现零次或多次或者第 1 组递归,然后是 }}
字符串
}}
- }}
字符串
\s*
- 零个或多个空格。
.*?}}
子表达式将查找以 }}
结尾的最短字符串。如果您想跳过 {{...}}
对,您必须这样说。
re.sub(r"\{\{source\|(?:\{\{.*?\}\})*.*?\}\}", "", line)
还要注意,如果你想扩展它来处理额外的嵌套级别,你也必须明确地拼写出来;正则表达式确实不是处理嵌套结构的合适工具,尤其是不是任意嵌套结构。 (这是一个common FAQ.)
你可以不用正则表达式来做到这一点,并涵盖所有级别的嵌入式元数据。
line = "# Test is a cool word {{source|{{nom w pc|Chantal|Bouchard}}, ''La langue et le nombril'', Presses de l'Université de Montréal (PUM), 2020, p. 174}}."
from itertools import accumulate
levels = accumulate( (c=="{")-(p=="}") for c,p in zip(line," "+line) )
result = "".join(c for c,level in zip(line,levels) if level==0)
print(result)
# Test is a cool word .
这计算了嵌入的增量“级别”,随着每个“{”上升,并在每个“}”后下降。级别为零的字符是实际文本的一部分,其他所有内容都被排除在外。
我有一个维基词典转储,正在努力寻找合适的正则表达式模式来删除表达式中的双括号。这是表达式的示例:
line = "# Test is a cool word {{source|{{nom w pc|Chantal|Bouchard}}, ''La langue et le nombril'', Presses de l'Université de Montréal (PUM), 2020, p. 174}}."
我希望删除以 {{source|:
开头的所有括号示例:# Test is a cool word.
我试过像这样使用 re.sub = re.sub("{{source\|.*?}}", "", line )
但是我得到了# Test is a cool word, ''La langue et le nombril'', Presses de l'Université de Montréal (PUM), 2020, p. 174}}.
我也可以再这样写一句话line = "# Test is a cool word {{source|Nicolas|Daniel, Presses de l'Université de Montréal 4}}"
感谢您的帮助!
您可以使用以下正则表达式来获得所需的答案。
\W+{{source\|.*}}
代码将是,
re.sub("\W+{{source\|.*}}", "", line )
除?
外,正则表达式与问题中的正则表达式几乎相同。删除 ?
使其尽可能多地匹配 .
。
此外,要在添加 {{}}
之前删除 space,请添加 \W+
。
您可以安装 PyPi 正则表达式库(在 terminal/console 中键入 pip install regex
并按 ENTER),然后使用
import regex
rx = r"\s*{{source\|(?>[^{}]|({{(?:[^{}]++|(?1))*}}))*}}\s*"
line = "# Test is a cool word {{source|{{nom w pc|Chantal|Bouchard}}, ''La langue et le nombril'', Presses de l'Université de Montréal (PUM), 2020, p. 174}}."
print( regex.sub('', line) )
# => # Test is a cool word.
参见Python demo。 正则表达式是
\s*\{\{source\|(?>[^{}]|(\{\{(?:[^{}]++|(?1))*}}))*}}\s*
参见regex demo。详情:
\s*
- 零个或多个空格{{source\|
- 文字{{source|
字符串(?>[^{}]|({{(?:[^{}]++|(?1))*}}))*
- 零次或多次重复:[^{}]
-{
和}
以外的字符
|
- 或({{(?:[^{}]++|(?1))*}})
- 第 1 组(递归所必需):{{
,除{{
和}}
之外的任何一个或多个字符出现零次或多次或者第 1 组递归,然后是}}
字符串
}}
-}}
字符串\s*
- 零个或多个空格。
.*?}}
子表达式将查找以 }}
结尾的最短字符串。如果您想跳过 {{...}}
对,您必须这样说。
re.sub(r"\{\{source\|(?:\{\{.*?\}\})*.*?\}\}", "", line)
还要注意,如果你想扩展它来处理额外的嵌套级别,你也必须明确地拼写出来;正则表达式确实不是处理嵌套结构的合适工具,尤其是不是任意嵌套结构。 (这是一个common FAQ.)
你可以不用正则表达式来做到这一点,并涵盖所有级别的嵌入式元数据。
line = "# Test is a cool word {{source|{{nom w pc|Chantal|Bouchard}}, ''La langue et le nombril'', Presses de l'Université de Montréal (PUM), 2020, p. 174}}."
from itertools import accumulate
levels = accumulate( (c=="{")-(p=="}") for c,p in zip(line," "+line) )
result = "".join(c for c,level in zip(line,levels) if level==0)
print(result)
# Test is a cool word .
这计算了嵌入的增量“级别”,随着每个“{”上升,并在每个“}”后下降。级别为零的字符是实际文本的一部分,其他所有内容都被排除在外。