Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式模块使用BRE还是ERE?_Python_Regex_Posix - Fatal编程技术网

Python正则表达式模块使用BRE还是ERE?

Python正则表达式模块使用BRE还是ERE?,python,regex,posix,Python,Regex,Posix,POSIX似乎将正则表达式实现分为两类:基本正则表达式(BRE)和扩展正则表达式(ERE) Python参考似乎没有指定。除了语法上的一些相似之处,remodule不遵循正则表达式的POSIX标准 不同匹配语义 POSIX正则表达式(可通过DFA/NFA甚至回溯引擎实现)始终查找最左边最长的匹配,而re模块是一个回溯引擎,它查找最左边的“最早”匹配(“最早”根据正则表达式定义的搜索顺序) 在匹配(Prefix | PrefixSuffix)与PrefixSuffix的情况下,可以观察到匹配语义的

POSIX似乎将正则表达式实现分为两类:基本正则表达式(BRE)和扩展正则表达式(ERE)


Python参考似乎没有指定。

除了语法上的一些相似之处,
re
module不遵循正则表达式的POSIX标准

不同匹配语义 POSIX正则表达式(可通过DFA/NFA甚至回溯引擎实现)始终查找最左边最长的匹配,而
re
模块是一个回溯引擎,它查找最左边的“最早”匹配(“最早”根据正则表达式定义的搜索顺序)

在匹配
(Prefix | PrefixSuffix)
PrefixSuffix
的情况下,可以观察到匹配语义的差异

  • 在POSIX正则表达式的POSIX实现中(不是那些仅借用语法的实现),正则表达式将匹配
    前缀suffix
  • 相反,
    re
    引擎(以及许多其他回溯正则表达式引擎)将只匹配
    前缀
    ,因为
    前缀
    是在替换中首先指定的
在将
(xxx | xxxxx)*
xxxxxxxxx
(10个
x
的字符串)进行匹配的情况下,也可以看出差异:

  • 关于Cygwin:

    $ [[ "xxxxxxxxxx" =~ (xxx|xxxxx)* ]] && echo "${BASH_REMATCH[0]}"
    xxxxxxxxxx
    
    所有10个
    x
    都匹配

  • 在Python中:

    >>> re.search(r'(?:xxx|xxxxx)*', 'xxxxxxxxxxx').group(0)
    'xxxxxxxxx'
    
    只匹配了9个
    x
    ,因为它在所有3次重复中选择交替
    xxx
    中的第一个项目,并且没有任何东西强迫它回溯并尝试交替中的第二个项目)

POSIX独占正则表达式特性 除了匹配语义上的差异外,POSIX正则表达式还定义了排序符号等价类表达式、以及基于排序的字符范围的语法。这些特性大大提高了正则表达式的表达能力

以等价类表达式为例,从文档中:

等价类表达式应表示属于等价类的排序元素集,如排序顺序所述。[...]. 该类应通过将等价类中的任何一个排序元素括在相等的括号(
“[=”
“=]”
)分隔符内来表示例如,如果
'a'
'a'
'a'
属于同一个等价类,那么
“[[=a=]b]”
“[[[=a=]b]”
”[[=a=]b]“都与
“[aáb]”等价。[……]

由于这些特性严重依赖于语言环境设置,因此同一个正则表达式在不同的语言环境中的行为可能不同。排序顺序还取决于系统上的区域设置数据

re
正则表达式功能
re
借用了Perl的语法,但并非Perl正则表达式中的所有功能都是在
re
中实现的。以下是
re
中可用的一些正则表达式功能,这些功能在POSIX正则表达式中不可用:

  • 贪婪/懒惰量词,指定扩展量词的顺序

    虽然人们通常称POSIX中的
    *
    为贪婪,但实际上它只指定POSIX中重复的下限和上限。所谓的“贪婪”行为是由于最左边的最长匹配规则

  • 环顾断言(向前看和向后看)
  • 条件模式
    (?(id/name)是模式|否模式)
  • 简写构造:
    \b
    \s
    \d
    \w
    (一些POSIX正则表达式引擎可能会实现这些构造,因为标准没有为这些情况定义行为)

  • 都不是。它基本上是PCRE方言,但却是一个独特的实现

    re
    文档中的第一句话是:

    此模块提供与Perl中类似的正则表达式匹配操作

    虽然这不会立即向新手揭示它们与POSIX正则表达式的关系,但众所周知,Perl 4和更高版本的Perl 5提供了比早期工具的正则表达式功能大幅度扩展的功能集,包括POSIX为
    grep-e
    所规定的功能集

    本文更详细地描述了正则表达式特性,尽管在Python文档中您会以不同的形式找到许多相同的细节。Perl手册页面包含以下历史信息:

    Perl模式匹配中使用的模式是从Version8正则表达式例程中提供的模式演变而来的。(这些例程是从亨利·斯宾塞(Henry Spencer)对V8例程的可自由再发行的重新实现中衍生出来的(遥远的)

    (这里,V8基本上是指.Spencer的库。)

    Perl 4有大量方便的构造,如
    \d
    \s
    \w
    ,以及符号速记,如
    \t
    \f
    \n
    。Perl 5添加了一组重要的扩展(仍在缓慢增长),包括但不限于:

    • 非贪婪量词
    • 非回溯量词
    • Unicode符号和属性支持
    • 非分组括号
    • 向前看和向后看
    • 。。。基本上是以
      (?
    因此,“正则”表达式不再是严格意义上的“正则”

    这是由Philip Hazell在一个便携库中重新实现的,最初用于Exim邮件服务器;他已经在无数不同的应用程序中找到了自己的方法,包括许多编程语言(Ruby、PHP、Python等)