繁体   English   中英

Python中的非贪婪正则表达式

[英]Non-greedy regex in Python

给定文本:

'Adf adf asdf asdf asfdf https://.com/abcabcabc kdfja ladsjfladsjf ladksjf ladsjfl adsfadf adf asdf asdf asfdf https://.com/abcabcabc \\ n kdfja ladsjfladsjf ladksjf ladsjcom / jfka \\ nka djldjfld djfladjf ldfdjlkfj ldfj。”

如何匹配https://.com/subdir形式的任何url [直到出现空格或换行,逗号或句号]?

尝试:

re.findall('http.*',s) 
['https://<somepage>.com/abcabcabc kdfja ladsjfladsjf ladksjf ladsjfl adsfadf adf asdf asdf asfdf https://<somepage>.com/abcabcabc', 'https://<somepage>.com/djflkajdsfl']

re.findall('http.* ',s) 
['https://<somepage>.com/abcabcabc kdfja ladsjfladsjf ladksjf ladsjfl adsfadf adf asdf asdf asfdf ']

re.findall('http.* ?',s) 
['https://<somepage>.com/abcabcabc kdfja ladsjfladsjf ladksjf ladsjfl adsfadf adf asdf asdf asfdf https://<somepage>.com/abcabcabc', 'https://<somepage>.com/djflkajdsfl']

re.findall('http.* {1}?',s) 
['https://<somepage>.com/abcabcabc kdfja ladsjfladsjf ladksjf ladsjfl adsfadf adf asdf asdf asfdf ']

re.findall('http.* +?',s) 
['https://<somepage>.com/abcabcabc kdfja ladsjfladsjf ladksjf ladsjfl adsfadf adf asdf asdf asfdf ']

re.findall('http.*[^ \n]',s) 
['https://<somepage>.com/abcabcabc kdfja ladsjfladsjf ladksjf ladsjfl adsfadf adf asdf asdf asfdf
https://<somepage>.com/abcabcabc', 'https://<somepage>.com/djflkajdsfl']

re.findall('http.*[^ \\n]',s) ['https://<somepage>.com/abcabcabc kdfja ladsjfladsjf ladksjf ladsjfl adsfadf adf asdf asdf asfdf
https://<somepage>.com/abcabcabc', 'https://<somepage>.com/djflkajdsfl']

re.findall('http.*[^ \\\n]',s) ['https://<somepage>.com/abcabcabc kdfja ladsjfladsjf ladksjf ladsjfl adsfadf adf asdf asdf asfdf
https://<somepage>.com/abcabcabc', 'https://<somepage>.com/djflkajdsfl']

re.findall('http.* *?',s) ['https://imgur.com/abcabcabc kdfja ladsjfladsjf ladksjf ladsjfl adsfadf adf asdf asdf asfdf https://imgur.com/abcabcabc', 'https://somepage.com/djflkajdsfl']

请尝试以下操作:

re.findall('http[^ \n,]*',s)

您可以在此处查看此操作。

由于您使用. ,懒惰( .*? )和贪婪( .* )都不适合您。 懒惰只会移动一个字符然后停止,而贪婪会一直持续到最后。

而是要指定不需要的字符。 [^ \\n,] ),然后进行搜索。 由于要在这些字符的第一个实例处停止,因此要使用贪婪搜索来执行此操作。

自从. URL中的字符是合法的,因此很难基于此限制字符串。 由于您始终想包含一个子目录,因此可以使用以下方法完成此操作:

re.findall('http[^ \\n,]*/[^ \\n,\.]*',s)

您可以在此处查看此操作。

第一个示例中的问题不在于regexp匹配的空格太多; 空格匹配了太多字母。 因此,不要放下您的“非贪婪” ? 空格后的修饰符,请将其放在.*后面,因为这与当前的匹配太多有关。

py3.7 >>> re.findall('http.*? ', s)
['https://.com/abcabcabc ']

另一方面, [^ \\n] 并不是任何修饰符,它是一个完全匹配的表达式。 因此,将其放在现有表达式之后并不会使其匹配程度降低; 您现在有两个匹配表达式,它们一起匹配更多。

您必须使用它代替匹配过多的表达式,而不是.

py3.7 >>> re.findall('http[^ \n]*', s)
['https://.com/abcabcabc', 'https://.com/abcabcabc', 'https://.com/djflkajdsfl']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM