我有一个输入字符串,例如:
input_str ='这是对[blah]和[blah / blahhhh]的测试'
我想保留[blah],但想从上面的字符串中删除[blah / blahhhh]。 我尝试了以下代码:
>>>re.sub(r'\[.*?\]', '', input_str)
'this is a test for and '
和
>>>re.sub(r'\[.*?\/.*?\]', '', input_str)
'this is a test for '
什么应该是正确的正则表达式模式来获得输出“这是对[blah]和”的测试?
答案 0 :(得分:0)
原始帖子中的第二个正则表达式与OP想要的匹配的原因是.
匹配任何字符,包括]
。因为\[.*?\/'
之前的\[.*?/
是多余的,所以\
(或仅/
匹配比OP想要的更多:[blah] and [blah/
input_str
}}
?
增加了混乱。它将限制.*
子表达式.*\]
部分的重复,但您必须了解您正在限制的重复次数[1]。最好明确匹配任何非结束括号而不是.
通配符。所谓的"贪心"匹配.*
通常是一个绊脚石,因为它将匹配零个或多个任何字符,直到该通配符匹配失败(通常比人们预期的要长得多)。在你的情况下,它会贪婪地匹配尽可能多的输入,直到正则表达式的下一个明确指定的部分(]
或/
出现 last )。不要使用?
来尝试抵消或限制与懒惰匹配的贪婪匹配,而是通常更好地明确贪婪部分中不匹配的内容。
作为示例,请参阅以下.*
抓取所有内容的示例,直到.*
之后上次出现该字符为止:
echo '////k////,/k' | sed -r 's|/.*/|XXX|'
XXXk
echo '////k////,/k' | sed -r 's|/(.*)?/|XXX|'
XXXk
贪婪/懒惰匹配行为的微妙之处可能从一个正则表达式实现到下一个(pcre,python,grep / egrep)不等。为了便于携带和简单/清晰,请尽可能明确。
如果您只想查找括号中不包含斜杠字符前面的右括号字符的字符串,则可以更明确地查找" not-a-closing-bracket"而不是通配符匹配:
re.sub(r'\[[^]]*/[^]]*\]', '', input_str)
'this is a test for [blah] and '
这使用字符类表达式 - [^]]
- 而不是通配符.
来匹配任何明显不是右括号的字符。
如果它"合法"在你的输入流中,在括号内(斜杠之前)有一个或多个右括号,然后事情变得更复杂,因为你必须确定它是否只是一个迷路括号字符或嵌套子表达式的开头。这开始听起来更像是令牌解析器的工作。
取决于你想要真正实现的目标(我假设这只是一个可能更复杂的虚拟例子)以及输入中允许的内容,你可能需要的不仅仅是我上面的简单修改。但无论如何它都适用于你的例子。
答案 1 :(得分:-1)
你可以编写一个函数,将input_str作为参数并循环通过字符串,如果它在'['和']'之间看到'/',则跳回'['的位置并删除所有元素,包括']'