`
姜太公
  • 浏览: 74897 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

lookahead和positive lookbehind

阅读更多

下了一本txt格式的小说,发现里面很多不是段落结束的地方竟然用了回车,看着很不爽,立刻祭起Python,想把里面所有的不该出现的回车消除掉。读取文件内容后,顺手写下re.sub(r'[^\n]\n[^\n]', '', content),很简单的一个正则,就是找出单个的换行符并且替换掉。用Java习惯了,因为Java的正则表达式没有lookahead等功能,我也很少时候。做完了想起python是支持lookahead的,何不试试。

 

先看看文档

(?=...)

Matches if ... matches next, but doesn't consume any of the string. This is called a lookahead assertion. For example, Isaac (?=Asimov) will match 'Isaac ' only if it's followed by 'Asimov' .

 

就是说如果括号里的...能匹配接下来的字符串,那么就尝试匹配当前字符串,但是不消耗任何东西。这东西叫做: 前视断言。例如Isaac (?=Asimov)只有在Isaac后面跟着Asimov的时候才能匹配Isaac

 

我试了下

>>>re.sub(r'a(?=bc)', 'X', 'abc a')
Xbc a

 果然不错,能能只能替换后面紧跟着bc的a,如果不用前视断言,那就得

>>>re.sub(r'a(bc)', r'X\1', 'abc a')
Xbc a

 看到了吧,还要把bc捕获以便保留,很麻烦。

 

接着我就犯了个错误,我想前世断言开来就是匹配一个位置,放到我们关注的词的前后应该是无所谓的,一定要区分前后吗

>>>re.sub(r'(?=ab)c', 'X', 'abc c')
abc c

 竟然不是我期望的abX c

然后才想起来,我忽略了“不消耗”三个字。前视断言的确是匹配一个位置,但这个位置只能是它之前的位置。比如

(?=bc)匹配abc中的位置:a(这里)bc,只匹配括号ab之间的位置。匹配之后,并没有消耗掉bc,下一个输入字符就是b。所以最后一个例子中,(?=ab)匹配了'abc c'的最开始,由于没有消耗ab,所以下一个输入字符是a,正则表达式期望输入的字符是c,匹配失败,(?=ab)不能匹配其他地方,整个匹配失败。

 

所以一定要注意:

1.lookahead所匹配的是括号里字符串的前面位置

2.没有消耗掉括号里的字符串

 

明白了这一种另外三种应该也没问题了

(?!...)

接下来的字符串不能和括号里的...匹配的时候,匹配当前位置。

 

(?<=...)

前面的字符串能和括号里的...匹配的时候,匹配当前位置。

 

(?<!...)

前面的字符串不能和括号里的...匹配的时候,匹配当前位置。

 

 

分享到:
评论
2 楼 姜太公 2009-07-17  
timshaw9791 写道
"因为Java的正则表达式没有lookahead等功能"
有吧?
jdk1.5 doc上面Pattern类下面有描述:


Special constructs (non-capturing)
(?:X) X, as a non-capturing group
(?idmsux-idmsux)  Nothing, but turns match flags on - off
(?idmsux-idmsux:X)   X, as a non-capturing group with the given flags on - off
(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind
(?>X) X, as an independent, non-capturing group



看了下文档,果然有。汗!看了几年都没发现,看来我看文档太不仔细了
1 楼 timshaw9791 2009-07-17  
"因为Java的正则表达式没有lookahead等功能"
有吧?
jdk1.5 doc上面Pattern类下面有描述:


Special constructs (non-capturing)
(?:X) X, as a non-capturing group
(?idmsux-idmsux)  Nothing, but turns match flags on - off
(?idmsux-idmsux:X)   X, as a non-capturing group with the given flags on - off
(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind
(?>X) X, as an independent, non-capturing group

相关推荐

    正则基础之——环视.rar

    环视分为前瞻断言(Positive Lookahead)和后瞻断言(Positive Lookbehind),以及它们的否定形式:负前瞻断言(Negative Lookahead)和负后瞻断言(Negative Lookbehind)。 1. 前瞻断言(Positive Lookahead):...

    深入浅析正则表达式 捕获组

    捕获组(capturing group)是正则...=) positive lookahead 4: (?!) negative lookahead 5: (?&lt;=) positive lookbehind 6: (?&lt;!) negative lookbehind 7: (?=), (?!), (?&lt;=), (?&lt;!)的捕获 1: () 捕获组 /

    正则表达式学习资料整理2

    =...)`和**负向前瞻(Negative Lookahead)**`(?!=...)`用于检查当前位置之后是否满足某种模式,但不实际消耗这些字符。 - **正向回溯(Positive Lookbehind)**`(?)`和**负向回溯(Negative Lookbehind)**`(?&lt;!.....

    经典正则表达式完美教程

    正则表达式还支持多种扩展功能,如正向前瞻断言(positive lookahead)和正向后瞻断言(positive lookbehind),它们在匹配时不会消耗字符,仅用于判断特定模式是否出现在当前位置之前或之后。此外,条件表达式允许我们...

    精通正则表达式

    预查(lookarounds)包括前瞻(positive lookahead)和后瞻(positive lookbehind),它们不进行实际的匹配,但能确保某个位置前后满足特定条件。 书中还会详细讲解各种元字符(meta-characters)和修饰符...

    RegExpr_Regexpr_

    - 后顾(Positive Lookbehind)与反后顾(Negative Lookbehind):检查某个位置后面是否满足特定条件,但不包括这些条件。 - 分组(Grouping):通过括号`()`定义匹配的子表达式,方便后续处理。 - 非贪婪匹配...

    Accp5.0 js 第五章

    8. **正向后顾查找(Positive Lookbehind)和负向后顾查找(Negative Lookbehind)**:(?)和(?&lt;!...)是JavaScript不直接支持的特性,但在某些环境中(如ES2018后的某些浏览器或Node.js)可以通过其他方式实现。 9. ...

    正则应用之——逆序环视探索.rar

    逆序环视分为肯定逆序环视(Positive Lookbehind)和否定逆序环视(Negative Lookbehind)。在“正则应用之——逆序环视探索”这个主题中,我们将深入探讨这两个概念以及它们在实际应用中的价值。 肯定逆序环视(?)...

    Regular Expression

    pattern)`)和后顾否定断言(Positive lookbehind `(?)`)。它们不消耗字符,仅检查是否存在匹配的模式。 8. **反向引用(Backreferences)**:在分组中,可以通过`\数字`来引用前面分组匹配的内容,如`\1`引用第一...

    正则表达式 电子书 教程 chm

    此外,预查(lookaround)包括前瞻(positive lookahead)和后顾(positive lookbehind),它们不消耗字符,只用于验证某个位置的前后是否符合特定条件。 在不同编程语言中,正则表达式的实现可能会有差异,但...

    正则表达式测试工具 regextester

    =...)`)和后顾(Positive Lookbehind `(?)`),用于确保某个位置前后满足特定条件。 - 非捕获组:`(?:...)`不会创建一个捕获组,仅用于逻辑上的分组。 通过`regextester`,用户可以逐步构建和测试复杂的正则...

    正则表达式30分钟入门教程.rar

    7. **预查否定(Positive and Negative Lookbehind)** - **正向预查断言(Positive lookbehind)**:如"(?)c"匹配"c",但必须在"ab"之后。 - **负向预查断言(Negative lookbehind)**:如"(?&lt;!ab)c"匹配"c",但不能在...

    正则表达式使用

    - 后顾断言(Positive Lookbehind, Negative Lookbehind):`(?)` 和 `(?&lt;!...)` 分别表示正向和负向后顾断言,也用于不消耗字符的匹配。 5. **正则表达式实例** - 邮箱验证:`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+...

    java 正则替换 保留原值并增加' ',

    然而,如果我们想要在替换过程中保留原值的一部分,就需要利用正向预查(Positive Lookahead)或正向后顾(Positive Lookbehind)等高级正则特性。 以题目中的"保留原值并增加' '"为例,假设我们有一个字符串`...

    JS前向后瞻正则表达式定义与用法示例

    前向后瞻分为正向肯定查找(positive lookahead)、正向否定查找(negative lookahead)、正向肯定后瞻(positive lookbehind)和正向否定后瞻(negative lookbehind)。 正向肯定查找使用语法"x(?=y)",表示匹配...

    Java正则表达式教程

    =...)`)和预查否定(Negative Lookahead `(?!...)`):确保某个模式后面或前面跟随另一个模式,但不包含在最终匹配的文本中。 - 后顾(Positive Lookbehind `(?)`)和后顾否定(Negative Lookbehind `(?&lt;!...)`)...

    jscript-正则表达式

    1. **预查(Positive Lookahead)**:`(?=pattern)`检查后面是否跟着指定的模式,但不包括在匹配结果中。 2. **负预查(Negative Lookahead)**:`(?!pattern)`检查后面不跟指定的模式。 3. **后顾(Positive ...

    Perl Regular Expressions

    - **正向先行断言(Positive Lookahead)**:`(?=...)`,确保当前位置之后的文本满足指定模式。 - **负向先行断言(Negative Lookahead)**:`(?!...)`,确保当前位置之后的文本不满足指定模式。 - **正向后行...

Global site tag (gtag.js) - Google Analytics