RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?<= , (?= , (?<! , (?! 有好多种称呼
(?<=
, (?=
, (?<!
, (?!
有好多种称呼 ,
我称为: 左限定, 右限定, 左否定, 右否定
(?<=左限定)
(?=右限定)
(?<!左否定)
(?!右限定)
再提炼
?<=
?=
?<!
?!
其它的称呼
正则表达式预查寻分为 4 种:
- 正向肯定预查:
(?=pattern)
(?=pattern) - 正向否定预查:
(?!pattern)
(?!pattern) - 反向肯定预查:
(?<=pattern)
(?<=pattern) - 反向否定预查:
(?<!pattern)
(?<!pattern)
比如:
- 匹配
babcab
中的第二个b
, 可以用(?<=a)b(?=c)
, 含义是:左a右c的b (?<!a)b(?!c)
的含义是: 左非a右非c的b, 它会匹配到第一个b
或者称为:
- 正向零宽度先行断言:
(?=exp)
(?=exp) - 正向零宽度回顾后断言:
(?!exp)
(?!exp) - 负向零宽度先行断言:
(?<=exp)
(?<=exp) - 负向零宽度回顾后断言:
(?<!exp)
(?<!exp)
或者称为:
- 肯定性:匹配
regex
- 否定性:不匹配
regex
- 前瞻:向前(右、正向)看(预查)
- 后顾:向后(左、反向)看(预查)
- 肯定性前瞻:先看看前方(右边)是否匹配
regex
,但不向前走 - 否定性前瞻:先看看前方(右边)是否不匹配
regex
,但不向前走 - 肯定性后顾:回头看后方(左边)是否匹配
regex
- 否定性后顾:回头看后方(左边)是否不匹配
regex
或者称为:
菜鸟教程-正则表达式的先行断言(lookahead)和后行断言(lookbehind)
-
(?=pattern)
零宽正向先行断言(zero-width positive lookahead assertion) -
(?!pattern)
零宽负向先行断言(zero-width negative lookahead assertion) -
(?<=pattern)
零宽正向后行断言(zero-width positive lookbehind assertion) -
(?<!pattern)
零宽负向后行断言(zero-width negative lookbehind assertion)
菜鸟教程-正则表达式 - 元字符
`
字符 | 描述 |
---|---|
(?=pattern) | 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 |
(?!pattern) | 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 |
(?<=pattern) | 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。 例如," (?<=95|98|NT|2000)Windows "能匹配"2000Windows "中的"Windows ",但不能匹配"3.1Windows "中的"Windows "。 |
(?<!pattern) | 反向否定预查,与正向否定预查类似,只是方向相反。 例如" (?<!95|98|NT|2000)Windows "能匹配"3.1Windows "中的"Windows ",但不能匹配"2000Windows "中的"Windows "。 |
来自 文心一言 4.0
在正则表达式中,如果你想限定一个模式(pattern)的左右相邻内容,你可以使用断言(assertions)。常见的断言有:
-
正向前瞻断言(Positive Lookahead) -
(?=pattern)
- 表示之后的字符序列需要匹配给定的模式,但该模式本身不会成为匹配结果的一部分。
-
负向前瞻断言(Negative Lookahead) -
(?!pattern)
- 表示之后的字符序列不能匹配给定的模式。
-
正向后顾断言(Positive Lookbehind) -
(?<=pattern)
- 表示之前的字符序列需要匹配给定的模式,但该模式本身不会成为匹配结果的一部分。
-
负向后顾断言(Negative Lookbehind) -
(?<!pattern)
- 表示之前的字符序列不能匹配给定的模式。
请注意,不是所有的正则表达式引擎都支持后顾断言,尤其是负向后顾断言。
下面是一些例子:
-
匹配被"abc"和"def"包围的字符串:
(?<=abc).*?(?=def)
在这个例子中,
.*?
是一个懒惰量词,它会匹配尽可能少的字符直到遇到def
。 -
匹配不被数字包围的单词:
\b(?<![0-9])[a-zA-Z]+\b(?![0-9])
这里使用了单词边界
\b
,负向后顾断言(?<![0-9])
和负向前瞻断言(?![0-9])
来确保单词的前后都不是数字。 -
匹配被引号包围的文本(不包含引号本身):
(?<=")[^"]*(?=")
这个表达式使用了正向后顾断言
(?<=")
和正向前瞻断言(?=")
来匹配引号之间的文本。[^"]*
匹配除引号外的任意字符(0个或多个)。
请记住,正则表达式中特殊字符和元字符通常需要转义(例如,在字符串中使用 \\
代替 \
,使用 \"
代替 "
)。这取决于你使用的编程语言和上下文。
最后,由于正则表达式的复杂性和多样性,建议在实际应用中仔细测试你的表达式以确保它按照预期工作。
来自 文心一言 3.5
正则表达式预查寻(也称为预查或断言)是一种特殊的匹配技术,用于在匹配位置之前或之后执行条件判断,而不会真正消耗字符串中的字符。预查寻可以用来限定左右相邻的内容,确保它们符合特定的模式。
预查寻包括正向预查和反向预查,每种预查又可以分为肯定预查和否定预查。
-
正向预查:
- 正向肯定预查:语法为
(?=pattern)
。它会匹配任何位置,该位置后面紧跟着符合指定模式的字符串。但是,该模式本身不会被包括在匹配结果中。例如,表达式Windows(?=95|98|NT)
会匹配任何以“Windows”开始,后面紧跟着“95”、“98”或“NT”的字符串。但匹配结果只包括“Windows”,不包括后面的操作系统版本。 - 正向否定预查:语法为
(?!pattern)
。它会匹配任何位置,该位置后面不能紧跟着符合指定模式的字符串。例如,表达式\d+(?!\.)
会匹配任何不以小数点结尾的数字序列。
- 正向肯定预查:语法为
-
反向预查:
- 反向肯定预查:语法为
(?<=pattern)
。它会匹配任何位置,该位置前面紧挨着符合指定模式的字符串。但是,该模式本身不会被包括在匹配结果中。例如,表达式(?<=19|20)\d{2}
会匹配任何以“19”或“20”开始的两位数字,但匹配结果不包括前面的“19”或“20”。 - 反向否定预查:语法为
(?<!pattern)
。它会匹配任何位置,该位置前面不能紧挨着符合指定模式的字符串。请注意,这种形式的反向否定预查在大多数正则表达式引擎中不受支持。
- 反向肯定预查:语法为
预查寻在正则表达式中非常有用,特别是在处理复杂的模式匹配和验证时。通过使用预查寻,你可以更精确地控制匹配的位置,确保左右相邻的内容符合特定的要求。
问 C知道 “如何用正则表达式限定左右相邻内容”
使用正则表达式可以通过限定左右相邻内容来配特定的模式。以下是一种常用的方法:
import re
# 使用正则表达式限定左右相邻内容
pattern = r'(?<=左边的内容)要匹配的内容(?=右边的内容)'
# 在文本中搜索匹配的内容
text = "左边的内容要匹配的内容右边的内容"
matches = re.findall(pattern, text)
# 输出匹配的结果
for match in matches:
print(match)
在上述代码中,我们使用了正则表达式的两个特殊符号来限定左右相邻内容:
(?<=左边的内容)
:表示要匹配的内容的左边必须是指定的左边内容。(?=右边的内容)
:表示要匹配的内容的右边必须是指定的右边内容。
你可以根据实际情况修改左边的内容
、要匹配的内容
和右边的内容
来适应你的需求。
问 C知道 “正则表达式预查寻”
正则表达式预查是一种特殊的正则表达式语法,用于在匹配过程中进行前瞻或后顾判断,而不会消耗字符。预查可以帮助我们在匹配时确定某些条件是否满足,从而更精确地匹配目标字符串。
正则表达式预查分为正向预查和反向预查两种类型。正向预查用于匹配在某个位置之后的内容,而反向预查则用于匹配在某个位置之前的内容。
下面是两个示例来演示正则表达式预查的使用:
- 正向预查示例:匹配后面跟着数字的单词
import re
text = "apple123 orange456 banana789"
pattern = r"\w+(?=\d)" # 匹配后面跟着数字的单词
result = re.findall(pattern, text)
print(result) # 输出:['apple', 'orange', 'banana']
- 反向预查示例:匹配前面跟着数字的单词
import re
text = "123apple 456orange 789banana"
pattern = r"(?<=\d)\w+" # 匹配前面跟着数字的单词
result = re.findall(pattern, text)
print(result) # 输出:['apple', 'orange', 'banana']
问 C知道 “正则表达式断言”
正则表达式断言是一种用于匹配字符串中特定位置的模式。它们不会消耗输入字符串,只是检查当前位置是否满足某些条件。正则表达式断言分为前行断言和后行断言。
-
前行断言(Positive Lookahead Assertion):用于匹配当前位置后面的内容是否满足某个条件。它使用语法
(?=pattern)
,其中pattern
是一个正则表达式。例如,要匹配字符串中包含"re"的单词,但不包括"regex"和"regular",可以使用前行断言re(?=gex|gular)
。 -
后行断言(Positive Lookbehind Assertion):用于匹配当前位置前面的内容是否满足某个条件。它使用语法
(?<=pattern)
,其中pattern
是一个定长的正则表达式。后行断言在Perl和Python中有一些限制,它们只能使用定长的表达式,不能使用*
、+
、?
等元字符。例如,要匹配除"regex"和"regular"之外的"re",可以使用后行断言(?<!g)re
。
需要注意的是,不同的编程语言对正则表达式断言的支持程度有所不同。Perl和Python对后行断言有一些限制,Java不支持*
和+
字符,而JavaScript则不支持后行断言。
可能不正确, 经验证, JavaScript是支持(?<=a)b(?=c)
这样的的
其它待验证