精华内容
下载资源
问答
  • 1.3.8 前或后 很多情况,只有当模式中其他部分也匹配时才会匹配模式的...这个修改版本的表达式使用一个肯定前(positive look-ahead)断言来匹配尖括号。前断言语法为(?=pattern)。 import re address ...

    1.3.8 前向或后向
    很多情况下,只有当模式中其他部分也匹配时才会匹配模式的某个部分。例如,在email解析表达式中,尖括号被标志为可选。在实际中,尖括号应当是成对的,所以只有当两个尖括号都出现或者都不出现时表达式才能匹配。这个修改版本的表达式使用一个肯定前向(positive look-ahead)断言来匹配尖括号。前向断言语法为(?=pattern)。

    import re
    
    address = re.compile(
        '''
        # A name is made up of letters, and may include"."
        # for title abbreviaations and middle initials.
        ((?P<name>
            ([\w.,]+\s+)*[\w.,]+
        )
        \s+
        ) # The name is no longer optional.
    
        # LOOKAHEAD
        # Email addresses are wrapped in angle brackets,but only
        # if both are present of neither is.
        (?= (<.*>$)   # Remainder wrapped in angle brackets
            |
            ([^<].*[^>]$)  # Remainder *not* wrapped in angle brackets
        )
    
        <?   # Optional opening angle bracket
    
        # The address itself: username@domain.tld
        (?P<email>
        [\w\d.+-]+     # Username
        @
        ([\w\d+\.])+   # Domain name prefix
        (com|org|edu)  # Limit the allowed top-level domains.
        )
    
        >? # Optional closing angle bracket
        ''',
        re.VERBOSE)
    
    candidates = [
        u'First Last <first.last@example.com>',
        u'No Brackets first.last@example.com',
        u'Open Bracket <first.last@example.com',
        u'Close Bracket first.last@example.com>'
        ]
    
    for candidate in candidates:
        print('Candidate:',candidate)
        match = address.search(candidate)
        if match:
            print('  Name:',match.groupdict()['name'])
            print('  Email:',match.groupdict()['email'])
        else:
            print('  No match')
    

    这个版本的表达式中有很多重要的变化。首先,name部分不再是可选的。这说明,单独的地址将不能匹配,而且还会避免匹配哪些格式不正确的“名/地址”组合。“name”组后面的肯定前向规则断言字符串的余下部分要么包围在一对尖括号中,要么不存在不匹配的尖括号,也就是尖括号要么都出现,要么都不出现。这个前向规则表述为一个组,不过前向组的匹配并不消费任何输入文本,所以这个模式的其余部分会从前向匹配之后的同一位置取字符。
    运行结果:

    Candidate: First Last first.last@example.com
    Name: First Last
    Email: first.last@example.com
    Candidate: No Brackets first.last@example.com
    Name: No Brackets
    Email: first.last@example.com
    Candidate: Open Bracket <first.last@example.com
    No match
    Candidate: Close Bracket first.last@example.com>
    No match

    否定前向(negative look-ahead)断言((?!pattern))要求模式不匹配当前位置后面的文本。例如:email识别模式可以修改为忽略自动系统常用的noreply邮件地址。

    import re
    
    address = re.compile(
        '''
        ^
    
        # AN address: username@domain.tld
    
        # Ignore noreply addresses.
        (?!noreply@.*$)
        [\w\d.+-]+     # Username
        @
        ([\w\d.]+\.)+     # Domain name prefix
        (com|org|edu)     # Limit the allowed top-level domains.
        $
        ''',
        re.VERBOSE)
    
    candidates = [
        u'first.last@example.com',
        u'noreply@example.com',
        ]
    
    for candidate in candidates:
        print('Candidate:',candidate)
        match = address.search(candidate)
        if match:
            print('  Match:',candidate[match.start():match.end()])
        else:
            print('  No match')
    

    以noreply开头的地址与这个模式不匹配,因为前向断言失败。
    运行结果:

    Candidate: first.last@example.com
    Match: first.last@example.com
    Candidate: noreply@example.com
    No match

    不用前向检查email地址username部分中的noreply,可以借助语法(?<!pattern)在匹配username之后使用一个否定后向(negative look-behind)断言来改写这个模式。

    import re
    address = re.compile(
        '''
        ^
    
        # An address: username@domain.tld
    
        [\w\d.+-]+     # Username
    
        # Ignore noreply addresses.
        (?<!noreply)
    
        @
        ([\w\d.]+\.)+    # Domain name prefix
        (com|org|edu)    # Limit the allowed top-level domains.
    
        $
        ''',
        re.VERBOSE)
    
    candidates = [
        u'first.last@example.com',
        u'noreply@example',
        ]
    
    for candidate in candidates:
        print('Candidate:',candidate)
        match = address.search(candidate)
        if match:
            print(' Match:',candidate[match.start():match.end()])
        else:
            print(' No match')
    

    后向匹配与前向匹配的做法稍有不同,其表达式必须使用一个定长的模式。只要字符数固定(没有通配符或区间),后向匹配也允许重复。
    运行结果:

    Candidate: first.last@example.com
    Match: first.last@example.com
    Candidate: noreply@example
    No match

    可以借助语法(?<=pattern)使用可定后向(positive look-behind)断言查找符合某个模式的文本。例如,一下表达式可以查找推特用户名。

    import re
    
    twitter = re.compile(
        '''
        # A twitter handle: @username
        (?<=@)
        ([\w\d_]+)    # Username
        ''',
        re.VERBOSE)
    
    text = '''This text includes two Twitter handles.
    One for @ThePSF,and one for the author,@doughellmann.
    '''
    
    print(text)
    for match in twitter.findall(text):
        print('Handle:',match)
    

    这个模式会匹配能构建一个推特用户名的字符序列,只要字符序列前面有一个@。
    运行结果:

    This text includes two Twitter handles.
    One for @ThePSF,and one for the author,@doughellmann.

    Handle: ThePSF
    Handle: doughellmann

    展开全文
  • 因此,在正则表达式里也有一致性的判断,要么两个尖括号一起出现,要么一个也不要出现。怎么样来实现这种判断呢?针对这种情况得引入新的正则表达式的语法:(?=pattern),这个语法它会向前搜索或者后搜索相关内容...
     在许多的情况下,很多要匹配内容是一起出现,或者一起不出现的。比如《》,< >,这样的括号,不存在使用半个的情况。因此,在正则表达式里也有一致性的判断,要么两个尖括号一起出现,要么一个也不要出现。怎么样来实现这种判断呢?针对这种情况得引入新的正则表达式的语法:(?=pattern),这个语法它会向前搜索或者向后搜索相关内容,如果不会出现就不能匹配。不过,这个匹配不会消耗任何输入的字符,它只是查看一下。例子如下:
     
    #python 3.6
    #蔡军生 
    #http://blog.csdn.net/caimouse/article/details/51749579
    #
    import re
    
    address = re.compile(
        '''
        # A name is made up of letters, and may include "."
        # for title abbreviations and middle initials.
        ((?P<name>
           ([\w.,]+\s+)*[\w.,]+
         )
         \s+
        ) # name is no longer optional
    
        # LOOKAHEAD
        # Email addresses are wrapped in angle brackets, but only
        # if both are present or neither is.
        (?= (<.*>$)       # remainder wrapped in angle brackets
            |
            ([^<].*[^>]$) # remainder *not* wrapped in angle brackets
          )
    
        <? # optional opening angle bracket
    
        # The address itself: username@domain.tld
        (?P<email>
          [\w\d.+-]+       # username
          @
          ([\w\d.]+\.)+    # domain name prefix
          (com|org|edu)    # limit the allowed top-level domains
        )
    
        >? # optional closing angle bracket
        ''',
        re.VERBOSE)
    
    candidates = [
        u'First Last <first.last@example.com>',
        u'No Brackets first.last@example.com',
        u'Open Bracket <first.last@example.com',
        u'Close Bracket first.last@example.com>',
    ]
    
    for candidate in candidates:
        print('Candidate:', candidate)
        match = address.search(candidate)
        if match:
            print('  Name :', match.groupdict()['name'])
            print('  Email:', match.groupdict()['email'])
        else:
            print('  No match')


    结果输出如下:
    Candidate: First Last <first.last@example.com>
      Name : First Last
      Email: first.last@example.com
    Candidate: No Brackets first.last@example.com
      Name : No Brackets
      Email: first.last@example.com
    Candidate: Open Bracket <first.last@example.com
      No match
    Candidate: Close Bracket first.last@example.com>

      No match

    深入浅出Numpy
    http://edu.csdn.net/course/detail/6149 

    Python游戏开发入门

    你也能动手修改C编译器

    纸牌游戏开发

    http://edu.csdn.net/course/detail/5538 

    五子棋游戏开发

    http://edu.csdn.net/course/detail/5487
    RPG游戏从入门到精通
    http://edu.csdn.net/course/detail/5246
    WiX安装工具的使用
    http://edu.csdn.net/course/detail/5207
    俄罗斯方块游戏开发
    http://edu.csdn.net/course/detail/5110
    boost库入门基础
    http://edu.csdn.net/course/detail/5029
    Arduino入门基础
    http://edu.csdn.net/course/detail/4931
    Unity5.x游戏基础入门
    http://edu.csdn.net/course/detail/4810
    TensorFlow API攻略
    http://edu.csdn.net/course/detail/4495
    TensorFlow入门基本教程
    http://edu.csdn.net/course/detail/4369
    C++标准模板库从入门到精通 
    http://edu.csdn.net/course/detail/3324
    跟老菜鸟学C++
    http://edu.csdn.net/course/detail/2901
    跟老菜鸟学python
    http://edu.csdn.net/course/detail/2592
    在VC2015里学会使用tinyxml库
    http://edu.csdn.net/course/detail/2590
    在Windows下SVN的版本管理与实战 
    http://edu.csdn.net/course/detail/2579
    Visual Studio 2015开发C++程序的基本使用 
    http://edu.csdn.net/course/detail/2570
    在VC2015里使用protobuf协议
    http://edu.csdn.net/course/detail/2582
    在VC2015里学会使用MySQL数据库
    http://edu.csdn.net/course/detail/2672


    展开全文
  • 因此,在正则表达式里也有一致性的判断,要么两个尖括号一起出现,要么一个也不要出现。怎么样来实现这种判断呢?针对这种情况得引入新的正则表达式的语法:(?=pattern),这个语法它会向前搜索或者后搜索相关内容...
  • 因此,在正则表达式里也有一致性的判断,要么两个尖括号一起出现,要么一个也不要出现。怎么样来实现这种判断呢?针对这种情况得引入新的正则表达式的语法:(?=pattern),这个语法它会向前搜索或者后搜索相关内容...

    前言

    在许多的情况下,很多要匹配内容是一起出现,或者一起不出现的。比如《》,< >,这样的括号,不存在使用半个的情况。因此,在正则表达式里也有一致性的判断,要么两个尖括号一起出现,要么一个也不要出现。怎么样来实现这种判断呢?针对这种情况得引入新的正则表达式的语法:(?=pattern),这个语法它会向前搜索或者向后搜索相关内容,如果不会出现就不能匹配。不过,这个匹配不会消耗任何输入的字符,它只是查看一下。

    例子如下:

    #python 3.6

    #蔡军生

    #http://blog.csdn.net/caimouse/article/details/51749579

    #

    import re

    address = re.compile(

    '''''

    # A name is made up of letters, and may include "."

    # for title abbreviations and middle initials.

    ((?P

    ([\w.,]+\s+)*[\w.,]+

    )

    \s+

    ) # name is no longer optional

    # LOOKAHEAD

    # Email addresses are wrapped in angle brackets, but only

    # if both are present or neither is.

    (?= (<.>$) # remainder wrapped in angle brackets

    |

    ([^]$) # remainder *not* wrapped in angle brackets

    )

    # optional opening angle bracket

    # The address itself: username@domain.tld

    (?P

    [\w\d.+-]+ # username

    @

    ([\w\d.]+\.)+ # domain name prefix

    (com|org|edu) # limit the allowed top-level domains

    )

    >? # optional closing angle bracket

    ''',

    re.VERBOSE)

    candidates = [

    u'First Last ',

    u'No Brackets first.last@example.com',

    u'Open Bracket

    u'Close Bracket first.last@example.com>',

    ]

    for candidate in candidates:

    print('Candidate:', candidate)

    match = address.search(candidate)

    if match:

    print(' Name :', match.groupdict()['name'])

    print(' Email:', match.groupdict()['email'])

    else:

    print(' No match')

    结果输出如下:

    Candidate: First Last

    Name : First Last

    Email: first.last@example.com

    Candidate: No Brackets first.last@example.com

    Name : No Brackets

    Email: first.last@example.com

    Candidate: Open Bracket

    No match

    Candidate: Close Bracket first.last@example.com>

    No match

    python里使用正则表达式的前向搜索否定模式

    上面学习前向搜索或后向搜索模式(?=pattern),这个模式里看到有等于号=,它是表示一定相等,其实前向搜索模式里,还有不相等的判断。比如你需要识别EMAIL地址:noreply@example.com,这个EMAIL地址大多数是不需要回复的,所以我们要把这个EMAIL地址识别出来,并且丢掉它。怎么办呢?这时你就需要使用前向搜索否定模式,它的语法是这样:(?!pattern),这里的感叹号就是表示非,不需要的意思。比如遇到这样的字符串:noreply@example.com,它会判断noreply@是否相同,如果相同,就丢掉这个模式识别,不再匹配。

    例子如下:

    #python 3.6

    #蔡军生

    #http://blog.csdn.net/caimouse/article/details/51749579

    #

    import re

    address = re.compile(

    '''''

    ^

    # An address: username@domain.tld

    # Ignore noreply addresses

    (?!noreply@.*$)

    [\w\d.+-]+ # username

    @

    ([\w\d.]+\.)+ # domain name prefix

    (com|org|edu) # limit the allowed top-level domains

    $

    ''',

    re.VERBOSE)

    candidates = [

    u'first.last@example.com',

    u'noreply@example.com',

    ]

    for candidate in candidates:

    print('Candidate:', candidate)

    match = address.search(candidate)

    if match:

    print(' Match:', candidate[match.start():match.end()])

    else:

    print(' No match')

    结果输出如下:

    Candidate: first.last@example.com

    Match: first.last@example.com

    Candidate: noreply@example.com

    No match

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    展开全文
  • 因此,在正则表达式里也有一致性的判断,要么两个尖括号一起出现,要么一个也不要出现。怎么样来实现这种判断呢?针对这种情况得引入新的正则表达式的语法:(?=pattern),这个语法它会向前搜索或者后搜索相关内容...

    前言

    在许多的情况下,很多要匹配内容是一起出现,或者一起不出现的。比如《》,< >,这样的括号,不存在使用半个的情况。因此,在正则表达式里也有一致性的判断,要么两个尖括号一起出现,要么一个也不要出现。怎么样来实现这种判断呢?针对这种情况得引入新的正则表达式的语法:(?=pattern),这个语法它会向前搜索或者向后搜索相关内容,如果不会出现就不能匹配。不过,这个匹配不会消耗任何输入的字符,它只是查看一下。

    例子如下:

    #python 3.6

    #蔡军生

    #http://blog.csdn.net/caimouse/article/details/51749579

    #

    import re

    address = re.compile(

    '''''

    # A name is made up of letters, and may include "."

    # for title abbreviations and middle initials.

    ((?P

    ([\w.,]+\s+)*[\w.,]+

    )

    \s+

    ) # name is no longer optional

    # LOOKAHEAD

    # Email addresses are wrapped in angle brackets, but only

    # if both are present or neither is.

    (?= (<.>$) # remainder wrapped in angle brackets

    |

    ([^]$) # remainder *not* wrapped in angle brackets

    )

    # optional opening angle bracket

    # The address itself: username@domain.tld

    (?P

    [\w\d.+-]+ # username

    @

    ([\w\d.]+\.)+ # domain name prefix

    (com|org|edu) # limit the allowed top-level domains

    )

    >? # optional closing angle bracket

    ''',

    re.VERBOSE)

    candidates = [

    u'First Last ',

    u'No Brackets first.last@example.com',

    u'Open Bracket

    u'Close Bracket first.last@example.com>',

    ]

    for candidate in candidates:

    print('Candidate:', candidate)

    match = address.search(candidate)

    if match:

    print(' Name :', match.groupdict()['name'])

    print(' Email:', match.groupdict()['email'])

    else:

    print(' No match')

    结果输出如下:

    Candidate: First Last

    Name : First Last

    Email: first.last@example.com

    Candidate: No Brackets first.last@example.com

    Name : No Brackets

    Email: first.last@example.com

    Candidate: Open Bracket

    No match

    Candidate: Close Bracket first.last@example.com>

    No match

    python里使用正则表达式的前向搜索否定模式

    上面学习前向搜索或后向搜索模式(?=pattern),这个模式里看到有等于号=,它是表示一定相等,其实前向搜索模式里,还有不相等的判断。比如你需要识别EMAIL地址:noreply@example.com,这个EMAIL地址大多数是不需要回复的,所以我们要把这个EMAIL地址识别出来,并且丢掉它。怎么办呢?这时你就需要使用前向搜索否定模式,它的语法是这样:(?!pattern),这里的感叹号就是表示非,不需要的意思。比如遇到这样的字符串:noreply@example.com,它会判断noreply@是否相同,如果相同,就丢掉这个模式识别,不再匹配。

    例子如下:

    #python 3.6

    #蔡军生

    #http://blog.csdn.net/caimouse/article/details/51749579

    #

    import re

    address = re.compile(

    '''''

    ^

    # An address: username@domain.tld

    # Ignore noreply addresses

    (?!noreply@.*$)

    [\w\d.+-]+ # username

    @

    ([\w\d.]+\.)+ # domain name prefix

    (com|org|edu) # limit the allowed top-level domains

    $

    ''',

    re.VERBOSE)

    candidates = [

    u'first.last@example.com',

    u'noreply@example.com',

    ]

    for candidate in candidates:

    print('Candidate:', candidate)

    match = address.search(candidate)

    if match:

    print(' Match:', candidate[match.start():match.end()])

    else:

    print(' No match')

    结果输出如下:

    Candidate: first.last@example.com

    Match: first.last@example.com

    Candidate: noreply@example.com

    No match

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

    本文标题: python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解

    本文地址: http://www.cppcns.com/jiaoben/python/210227.html

    展开全文
  • 引用构造

    2005-03-25 10:57:00
    表列出了用于将后引用修饰符添加到正则表达式中的可选参数。...可以使用单引号替代尖括号,例如 /kchar。请注意八进制转义代码和使用相同表示法的 /number 后引用之间的多义性。有关正则表达式引擎如
  • [Python标准库]re——正则表达式 前或后  很多情况,仅当模式中另外某个部分也匹配时才匹配模式的某一部分,...修改后的表达式使用了一个肯定前(positive look-ahead)断言来匹配尖括号对。前断言语法为
  • birt使用xml数据源

    2009-06-11 17:42:44
    新建数据集,如图: 一步,设置xpath,选择user,然后点右的尖括号,如图: 默认为第一项。一步,设置显示的列,这里我们显示全部,点双向右尖括号。将把左边的全部项做为列显示。见图: 点击OK完成。 ...
  • HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。首先进入...
  • 今天小编利用美丽的汤来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;因此可以说Beautiful ...
  • 今天小编利用美丽的汤来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;因此可以说Beautiful ...
  • HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。首先进入...
  • HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;因此可以说Beautiful Soup库是解析、遍历、维护“标签树”的功能库。 如何利用BeautifulSoup抓取...
  • HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 京东网...
  • HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 首先...
  • 这里直接放图片 首先进入界面: ...点击向下的那个尖括号 最后确定修改后点击右边的这个写有ab的符号的位置 就这样,当前文件里所有同名的都被修改好了. 哎,这样就可以朴实无华的装上13了doge. ...
  • java泛型

    2020-07-09 15:48:57
    java泛型什么是泛型泛型的定义为什么使用泛型应用场景 什么是泛型 Java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所...泛型类型变量由尖括号界定,放在类或接口名的后面,下面定义尖括号中的T
  • HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;因此可以说Beautiful Soup库是解析、遍历、维护“标签树”的功能库。 首先进入京东网,输入自己...
  • java特性之泛型

    2017-12-25 14:12:44
    在类型后面加一个尖括号,括号内大写字母 多泛型变量 字母规范 最好E K V T N    泛型的统配符 引用传递 向上传递 向下传递 ?可接受任意的内容 只能接受不能修改   extends 泛型上限 ? extends ...
  • ArrayList中的尖括号泛型不能是基本类型,因为集合里保存的都是地址值,而基本类型的数据没有地址值。 如果希望集合ArrayList当中存储基本类型数据,必须使用基本类型对应 的“包装类" 基本类型 包装类(引用类型...
  • 考点:图的相关知识 解析: ...注意向下尖括号是数学中或(||)的表示。这题思路为假设PQ两值的不同情况。 P Q 1 1 1 0 0 0 0 1 然后带入表达式中进行判断,题不难,只是乱。 答.
  • 在struts2框架,可以前台直接返回数据(感觉上是这样的), 但是在使用ajax技术中,为什么不能直接返回数据(对象)呢?... 这样就可以了,从前端接收就好了(不能加尖括号凑合这看吧,pssList是传递的数据)
  • 泛型

    2018-07-28 14:01:36
    泛型主要解决程序参数类型转换问题,解决向下转型出现的安全问题 泛型指在类定义时不会设置类的属性或方法中参数具体类型,而是在使用时再进行设定,所以使用泛型时必须做一个类型标记的声明 class Myclass&...
  • 泛型:在类定义的时候并不会设置类中的...2.取消向下转型所带来的隐患。 泛型的基本语法: class MyClass&lt;T&gt;{ T value; } 尖括号 &lt; &gt;中的T被称作是类型参数,用于指代任何类型,实...
  • Java:泛型

    2018-07-30 19:35:45
    泛型:JDK1.5以后引入的新特性之一,其作用是检测编译期参数类型设置问题,取消向下转型带来的安全隐患。用于泛型类、泛型方法以及泛型接口。 一、泛型类: 泛型类指的就是在类的定义时并不会设置类中的属性或方法...
  • Js框架设计之DomReady

    2017-03-06 16:36:00
    1、HTML是一种标记语言,告诉我们这页面里面有什么内容,但是行为交互则要通过DOM操作来实现,但是注意:不要把尖括号里面的内容看作是DOM! 2、HTML是要通过浏览器解析之后才会转换成为DOM节点 一般地,但我们浏览器...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
热门标签
关键字:

向下尖括号