提问人:pistacchio 提问时间:11/6/2009 最后编辑:Peter Mortensenpistacchio 更新时间:8/17/2023 访问量:830048
正则表达式:匹配除特定模式之外的所有内容
Regex: match everything but a specific pattern
答:
只需匹配 ,然后拒绝任何匹配它的内容。/^index\.php/
评论
str !~ /\Aindex\.php/
您可以从一开始就使用否定的展望,例如,不应匹配以 . 开头的任何内容。^(?!foo).*$
foo
评论
在 Python 中:
>>> import re
>>> p='^(?!index\.php\?[0-9]+).*$'
>>> s1='index.php?12345'
>>> re.match(p,s1)
>>> s2='index.html?12345'
>>> re.match(p,s2)
<_sre.SRE_Match object at 0xb7d65fa8>
评论
您可以在字符集的开头放置 a 以匹配除这些字符之外的任何内容。^
[^=]*
将匹配所有内容,但=
评论
正则表达式:匹配所有内容,但:
- 以特定模式开头的字符串(例如,any - empty, too - 字符串不以 开头):
foo
- 基于 Lookahead 的 NFA 解决方案:
- 基于否定字符类的正则表达式引擎解决方案,不支持环理方法:
- 以特定模式结尾的字符串(例如,末尾的 no):
world.
- 包含特定文本的字符串(例如,不匹配具有以下字符串的字符串):
foo
- 基于环视的解决方案:
- POSIX 解决方法:
- 包含特定字符的字符串(例如,避免匹配具有符号的字符串):
|
- 一个等于某个字符串的字符串(比如说,不等于 ):
foo
- 基于环视:
- POSIX的:
- 字符序列:
- PCRE(匹配任何文本,但):
/cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i
或/cat(*SKIP)(*FAIL)|(?:(?!目录号)。+/是
cat
- 其他允许环视的引擎:
(cat)|[^c]*(?:c(?!at)[^c]*)*
(或 (?s)(cat)|(?:(?!目录号)。*
,或 ),然后用语言表示:如果 Group 1 匹配,则不是我们需要的,否则,如果不为空,则获取匹配值(cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*
- PCRE(匹配任何文本,但):
- 某个字符或一组字符:
演示说明:在演示中,换行符用于否定字符类中,以避免匹配溢出到相邻行。在测试单个字符串时,它们不是必需的。\n
锚注:在许多语言中,用于定义字符串的明确开头,并且(在 Python 中,它是 ,在 JavaScript 中是可以的)定义字符串的末尾。\A
\z
\Z
$
点注:在许多风格(但不是 POSIX、TRE、TCL)中,匹配除换行符之外的任何字符。确保使用相应的 DOTALL 修饰符(在 PCRE/Boost/.NET/Python/Java 和 Ruby 中)来匹配任何字符,包括换行符。.
/s
/m
.
反斜杠说明:在必须声明允许转义序列的 C 字符串模式的语言中(例如换行符),您需要将转义特殊字符的反斜杠加倍,以便引擎可以将它们视为文字字符(例如,在 Java 中,将被声明为 ,或使用字符类:)。使用原始字符串文字 (Python)、C# 逐字字符串文字或斜杠字符串/正则表达式表示法,如 .\n
world\.
"world\\."
"world[.]"
r'\bworld\b'
@"world\."
/world\./
评论
^(?!foo$)
^(?!foo)$
$
^(?!foo)$
foo
^(?!foo$)
foo
^(?!foo)$
regex.replace(myString, “^.*?(?:cot|lan)\s*”, “”)。
cot
lan
经过长时间的搜索,发现了这个线程。我在多次搜索和替换某些事件时遇到了这个问题。但是我使用的模式一直匹配到最后。示例如下
import re
text = "start![image]xxx(xx.png) yyy xx![image]xxx(xxx.png) end"
replaced_text = re.sub(r'!\[image\](.*)\(.*\.png\)', '*', text)
print(replaced_text)
给
start* end
基本上,正则表达式从第一个到最后一个匹配,吞噬中间![image]
.png
yyy
使用上面发布的 Firish https://stackoverflow.com/a/17761124/429476 的方法打破了事件之间的匹配。这里的空间不匹配;因为单词被空格隔开。
replaced_text = re.sub(r'!\[image\]([^ ]*)\([^ ]*\.png\)', '*', text)
并得到了我想要的
start* yyy xx* end
评论