【问题标题】:How to match every thing except some character ? regex如何匹配除某些字符之外的所有内容?正则表达式
【发布时间】:2014-12-02 16:45:55
【问题描述】:

我有这两个字符串:

s2 = 开始 bla bla bla word1 bla bla bla word1 value1 word1 bla bla bla

s1= 开始 bla bla bla word1 bla bla bla word1 bla bla bla word1 value1

我想检查s 是否有值1,但它应该在第二个word1 之后。 所以 s1 应该返回 value1,但 s2 应该返回 None 因为 value1 在第三个 word1 之后。

我试过了:

re.search('start(.*?word1){2}\s+(value1)')

我的搜索为 s1 和 s2 返回 value1 的问题?因为. 包含所有内容!

【问题讨论】:

    标签: python regex python-2.7 python-3.x


    【解决方案1】:

    使用如下所示的否定前瞻断言。下面的正则表达式将捕获字符串 value1 ,前提是它前面正好有两个 word1 字符串。

    r'start(?:(?:(?!word1).)*word1){2}(?:(?!word1).)*?(value1)'
    

    (?:(?!word1).)* 将匹配任何字符,但不匹配 word1 零次或多次。也就是说,在匹配单个字符之前,正则表达式引擎会检查该字符是否不是w,后跟ord1。如果没有,那么只有正则表达式引擎会匹配以下字符。此检查将在匹配每个字符之前进行。一旦看到word1 字符串,它将停止匹配。

    DEMO

    >>> import re
    >>> s2 = "start bla bla bla word1 bla bla bla word1 value1 word1 bla bla bla"
    >>> s1= "start bla bla bla word1 bla bla bla word1 bla bla bla word1 value1"
    >>> re.search(r'start(?:(?:(?!word1).)*word1){2}(?:(?!word1).)*?(value1)', s2)
    <_sre.SRE_Match object at 0x7f0bb60e9558>
    >>> re.search(r'start(?:(?:(?!word1).)*word1){2}(?:(?!word1).)*?(value1)', s2).group(1)
    'value1'
    >>> re.search(r'start(?:(?:(?!word1).)*word1){2}(?:(?!word1).)*?(value1)', s1)
    >>> 
    

    【讨论】:

    • 哇,你真聪明!现在我正在努力理解你的表情!
    • (?:.(?!word1))* 和 (?:(?!word1).)* 有区别吗
    • 是的,有区别。
    • 有什么区别?
    • (?:.(?!word1))* 匹配任何字符,但不匹配字符串word1之后的字符。也就是说,它会检查我们要匹配的字符后面的字符串或字符。跨度>
    【解决方案2】:

    您可以使用以下函数,在正则表达式中使用re.findall 和正look-behind

    >>> def find(val,s):
    ...  if re.findall(r'(?<=word1 )\w+',s)[1]==val:
    ...    return val
    ...  else :
    ...    return None
    ... 
    >>> print find('value1',s1)
    None
    >>> print find('value1',s2)
    value1
    

    【讨论】:

    • 什么 (?
    • @david 它在正则表达式中的正面观察,我在答案中添加了链接。它告诉正则表达式引擎在字符串中暂时后退,并匹配 () 前面的所有内容(此处为 (?&lt;=word1 )),并匹配 word1 之后的每个 \w+
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多