正则表达式和python表示不匹配多个连续字符

时间:2015-12-30 20:05:01

标签: python regex

我知道在正则表达式中我们可以使用"determineClickType"来声明除了之外的东西。例如,^表示没有空格的字符串。我们如何使用它来找到除了两个以上的连续字符。例如,当一个字符串可以包含[^ ]*?时,它不包含{{。我尝试了这些并且没有工作:

{

这是为了捕获以re.compile(r"(\{\{`[^(\{\{)]*?\}\}`) re.compile(r"(\{\{`[^\{\{]*?\}\}`) 开头并以{{结尾的文件中的字符串,但不包含}},但它们可以包含}}个字符串} 。使用.*也不是一种选择。

input_string="blah blah blah {{cite journal |last=Malatesta|first=Errico|title=Towards Anarchism|journal=MAN!|publisher=International Group of San Francisco|location=Los Angeles|oclc=3930443|url=http://www.marxists.org/archive/malatesta/1930s/xx/toanarchy.htm|archiveurl=http://web.archive.org/web/20121107221404/http://marxists.org/archive/malatesta/1930s/xx/toanarchy.htm|archivedate=7 November 2012 |deadurl=no|authorlink=Errico Malatesta |ref=harv}} blah blah blah"
regexp_1 = re.compile(r"(\{\{[^\}]*?\}\})") 
output = regexp_1.sub("",input_string )

现在regexp_1,我想将[^\}]*?替换为[^\}\}]*?,我知道[^\}\}]*?不正确,因为它的工作方式与[^\}]*?相同。

4 个答案:

答案 0 :(得分:1)

  

这是为了捕获以{{和结尾}}开头的文件中的字符串,但它们不包含}},而它们可以包含单个}

your_string = "{{first group}} {{second {} group}}"
pattern = re.compile(r'{{.*?}}')
pattern.findall(your_string)  # returns list of matches 

将返回

['{{first group}}', '{{second {} group}}']

答案 1 :(得分:1)

在{{之后看起来你真正想要的是先匹配}}。最简单的正则表达式是:

\{\{.*?\}\}

确保配置。如果允许它们在里面,则匹配换行符。

如果您担心性能,我会说这个正则表达式是最快的之一。替代方案是:

1)使用negative lookahead

\{\{((?!\}\}).)*\}\}

具有可比性能,因为您将提前检查每个角色

2)使用atomic grouppossessive quantifier

\{\{(?>[^{]|\{[^{])**\}\}

由于使用“?>”,这个实际上可能会更快和“**”构造它不会潜水已经匹配的值 - 因此将通过单次运行完成所有事情。 P.S。:确保你的正则表达式引擎支持这种结构。

答案 2 :(得分:0)

对于这种情况,您可以使用negative look ahead

^((?!}}).)*$

要捕获{{}}之间的字符串,您可以使用前面的正则表达式re.search()

>>> s = 'this {{ is {a} sample }}text'
>>> re.search(r'{{(((?!}}).)*)}}',s).group(1)
' is {a} sample '

答案 3 :(得分:0)

据我所知,您不能使用[^word]之类的内容,因为除了wor,{{1 }}

另外,我知道只有在d没有跟myword(?!something)后才能使用myword等否定前瞻来匹配something

然而,为了匹配不是一个单词的东西我知道你必须使用一些技巧,如本文Match everything except for specified strings

中所描述的

对于您的具体情况,您可以使用此正则表达式来检查该行是否包含{{

^(?!.*\{\{)

<强> Regex Demo

另一方面,如果你使用PCRE正则表达式,那么你可以使用discard动词,所以如果你想跳过像{{something}}这样的模式,你可以使用它:

\{\{\w+\}\}(*SKIP)(*FAIL)|(\w+)
           ^^^^^^^^^^^^^^ if your pattern matches, it will be discarded intentionally 

<强> Working demo