Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 我的正则表达式怎么了?_Python_Regex - Fatal编程技术网

Python 我的正则表达式怎么了?

Python 我的正则表达式怎么了?,python,regex,Python,Regex,我希望字符串与正则表达式不匹配,但它是 >>> re.compile('^P|([LA]E?)$').match('PE').group() 'P' 这似乎是一个错误,因为我认为美元没有办法匹配。另一方面,Python的re-lib似乎不太可能无法处理这个简单的情况。我是不是遗漏了什么 顺便说一句,Python会在我启动它时打印出来: Python 2.5.4 r254:67916,2008年12月23日,15:10:54[MSC v.1310 32位英特尔]在win32上

我希望字符串与正则表达式不匹配,但它是

>>> re.compile('^P|([LA]E?)$').match('PE').group()
'P'
这似乎是一个错误,因为我认为美元没有办法匹配。另一方面,Python的re-lib似乎不太可能无法处理这个简单的情况。我是不是遗漏了什么

顺便说一句,Python会在我启动它时打印出来:

Python 2.5.4 r254:67916,2008年12月23日,15:10:54[MSC v.1310 32位英特尔]在win32上 有关详细信息,请键入帮助、版权、信用证或许可证


你写了p或[LA]E?。P匹配

如果您的意思是锚适用于这两种情况,那么您的意思可能是:

^?:p |[LA]E?$

它将匹配^p或[LA]E$。你是说^?:P |[LA]E美元吗

变成

^P
|
([LA]E?)$

它在MacOSX和LinuxDebian测试上打印相同的输出。我会惊讶地看到一个bug在三个主要平台上表现相同。此外,“PE”开头有“P”,所以我认为它与正则表达式匹配没有问题。同样,“AE”也与regex匹配。在Debian和Mac OS X上。

还有另外两点值得一提:^在使用re.match时是多余的,如果要匹配字符串的结尾,请使用r\Z,而不是$

为什么$是邪恶的:假设我们想要检查一些字符串的整体是否与一些模式foo匹配。我们不想称之为匹配,如果有任何后的模式。让我们看看如果模式后面有一条换行符会发生什么

>>> import re
>>> s = 'foo\n'
>>> re.match('foo$', s)
<_sre.SRE_Match object at 0x00BAFE90> # match -- FAIL!
>>> re.match('foo\Z', s) # no match -- OK
>>>
以下是摘录自:

$的文档:匹配字符串结尾或字符串结尾的换行符之前。。。这是使用默认模式,与多行模式无关


Docs for\Z:仅在字符串末尾匹配。与模式无关,也不会被新词吓坏。

啊,是的。我猜它是这样解析的,因为^和$被视为常规字符。是吗?除了|字符(分组优先级很低)之外,它们在表达式中被视为其他任何东西。这不是错误,而是编写的正则表达式不是询问者想要的。什么是\Z?我很确定$匹配字符串的结尾,除非您使用的是re.multiliteoh!谢谢是的,我知道这一点,看起来很邪恶。另一方面,我相信大多数人都知道$,这使它比\Z更具可读性:/
>>> import re
>>> s = 'foo\n'
>>> re.match('foo$', s)
<_sre.SRE_Match object at 0x00BAFE90> # match -- FAIL!
>>> re.match('foo\Z', s) # no match -- OK
>>>