Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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,我有这个字符串: z='Certainly. I like apples... Really? By all means. Yes!' 我想捕获,?和而不是…子字符串,因此所需的输出应为: ['.', '?', '.', '!'] 这就是我得到的: >>> re.findall('(?<!\.)[\.?!]', z) ['.', '.', '?', '.', '!'] 与我所期望的完全相反,我不明白为什么,因为我要求前视不匹配,如果前面有两个点(尝试使用量词any

我有这个字符串:

z='Certainly. I like apples... Really? By all means. Yes!'
我想捕获
而不是
子字符串,因此所需的输出应为:

['.', '?', '.', '!']
这就是我得到的:

>>> re.findall('(?<!\.)[\.?!]', z)
['.', '.', '?', '.', '!']
与我所期望的完全相反,我不明白为什么,因为我要求前视不匹配,如果前面有两个点(尝试使用量词any operator
+?*{1,2}
会产生错误,因为后视需要固定宽度的模式)

我误解了一些事情,因为我希望在前瞻中添加第二个
\。
将产生我想要的输出


如果您有任何建议和简短的解释,我将不胜感激(找不到与我要求的完全相同的内容)。

您可以尝试下面的正则表达式,它使用负向后看和向前看

>>> import re
>>> z='Certainly. I like apples... Really? By all means. Yes!'
>>> z
'Certainly. I like apples... Really? By all means. Yes!'
>>> m = re.findall(r'(?<!\.)[.?!](?!\.)', z)
>>> m
['.', '?', '.', '!']
>>重新导入
>>>当然可以。我喜欢苹果。。。真正地尽一切办法。是的
>>>z
”“当然。我喜欢苹果。。。真正地尽一切办法。是的

>>>m=re.findall(r’(?您可以尝试下面的正则表达式,它使用负向后看和向前看

>>> import re
>>> z='Certainly. I like apples... Really? By all means. Yes!'
>>> z
'Certainly. I like apples... Really? By all means. Yes!'
>>> m = re.findall(r'(?<!\.)[.?!](?!\.)', z)
>>> m
['.', '?', '.', '!']
>>重新导入
>>>当然。我喜欢苹果……真的吗?当然。是的
>>>z
当然。我喜欢苹果……真的吗?当然。是的
>>>m=re.findall(r’(?另一种可能性:

pat = re.compile(r"\.\.\.|([.?!])")
matches = filter(None, pat.findall(z))
这是通过匹配文本
并在我们有机会将该字符串放入捕获组(在“或”管道(
|
)的另一侧)之前使用该字符串,然后过滤结果以删除所有
'
(这就是
findall
在发现与空捕获组匹配时使用的方法)

这被一些人称为另一种可能性:

pat = re.compile(r"\.\.\.|([.?!])")
matches = filter(None, pat.findall(z))
这是通过匹配文本
并在我们有机会将该字符串放入捕获组(在“或”管道(
|
)的另一侧)之前使用该字符串,然后过滤结果以删除所有
'
(这就是
findall
在发现与空捕获组匹配时使用的方法)


这被一些人称为

是的,这很有效,谢谢……为什么让它成为一个原始字符串有效?为了避免逃逸,它会寻找
\。
文字吗?为什么它被读为
而不是
\。
?@xv70,因为在正则表达式解析字符串之前,你忘记了Python对字符串的解析。Python将
\.
解析为文本
,然后正则表达式将
解析为“任意字符”。Python解析
r“\
作为一个文本
\。
和regex将
\。
作为一个文本
@xv70 N.B.在regex上RE:raw string notation是的,这很有效,谢谢…为什么将其作为一个原始字符串工作?为了避免通过\N然后它不会寻找
\。
文本?为什么它读作
而不是
\.
?@xv70,因为在正则表达式解析字符串之前,您忘记了Python对字符串的解析。Python将
\.
解析为文本
,然后正则表达式将
解析为“任意字符”。Python解析
r“\
作为文本
\。
和正则表达式将
\。
作为文本
@xv70 N.B.在正则表达式RE:raw string notation上解析