正则表达式匹配字符周围的字符,正则表达式中的AND运算符?

Posted

技术标签:

【中文标题】正则表达式匹配字符周围的字符,正则表达式中的AND运算符?【英文标题】:regex matching characters AROUND a character, AND operator in regex? 【发布时间】:2021-08-14 20:30:15 【问题描述】:

在正则表达式方面我并没有那么令人印象深刻......

我试图匹配一个单词中除了第二个字符之外的所有字符。

我想匹配 '&' 和 'uml' 但不是字符串中的第二个字符。

示例字符串:

&auml &zuml &ouml &euml

我想出了以下两个正则表达式。

这个匹配“uml”除了第一个字符(&):

(?=.)uml --> https://regex101.com/r/yrhzSU/1

这匹配除最后 3 个 (uml) 之外的第一个字符

&(?=.) --> https://regex101.com/r/LgRtd3/1

您认为将这些组合起来很容易,但我正在努力寻找任何类型的 AND 运算符。我可以使用 OR (|) 运算符,但它也可以匹配不严格以 '&' 开头并以 'uml' 结尾的字符串。

&(?=.)uml 

使用 OR 组合链接到正则表达式:https://regex101.com/r/MuhxM9/1

【问题讨论】:

你可以做的是使用 2 个捕获组而不是 (&)[aeoz](uml) regex101.com/r/tIXxHk/1 嗨@Thefourthbird,我相信这个表达式也会匹配第二个字符。我正在尝试匹配第一个字符 (&) 和字符 3,4 和 5。不过,您可能让我朝着正确的方向前进,我会尝试使用它。谢谢! 它确实匹配第二个字符,但你不能在这样匹配时真正跳过一个字符。这样你就有了 2 个捕获组。 您将如何处理捕获的数据?如果您只是输出它并且保证&,则在输出时手动添加& 前缀。如果 & 可以是 $ 之类的其他名称,那么您需要使用捕获组并将组 1 连接到组 2,每个 @Thefourthbird 的示例。 嗨@MonkeyZeus,我的目标是使用-replace 来删除这些匹配的字符,例如我想将“&aum”变成“a” 【参考方案1】:

结合使用积极的前瞻和后瞻,我相信您可以实现这一目标

&(?=.uml)|(?<=&.)uml

Regexr

解释:

&amp;(?=.uml) 匹配 &amp; 后跟 .uml 但不包括 .uml 匹配 (?&lt;=&amp;.)uml 匹配 &amp;.(不包括在匹配中,因为它在后视中)后跟 uml

希望这会有所帮助

编辑:我删除了@The fourth bird 指出的不必要的捕获组

【讨论】:

请注意,您不需要捕获组,您可能会使模式更具体&amp;(?=[aeoz]uml\b)|(?&lt;=&amp;[aeoz])uml\b【参考方案2】:

关于您尝试过的模式:

使用(?=.)uml 将始终匹配uml,因为正向前瞻断言直接在右侧的是任何字符(即u,因此您可以省略前瞻) 使用&amp;(?=.) 匹配与号,并断言右边有任何字符 使用&amp;(?=.)uml 将不会匹配任何内容,因为前瞻是一个非消耗性断言,并且断言(不匹配)uml 之前的字符)

如果要进行替换,请将&amp;aum 转换为a 而不是使用环视,您可以匹配与号,捕获a e oz 中的1 个使用字符类在第 1 组中并匹配以下放大器

在替换使用捕获组 1 保留您捕获的内容。

&([aeoz])uml\b

查看regex demo

【讨论】:

以上是关于正则表达式匹配字符周围的字符,正则表达式中的AND运算符?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别