[英]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']
第一个示例中的问题不在于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.