python基礎:re模塊匹配時貪婪和非貪婪模式


python貪婪和非貪婪

  正則表達式通常用於在文本中查找匹配的字符串。Python里數量詞默認是貪婪的(在少數語言里也可能是默認非貪婪),總是嘗試匹配盡可能多的字符;非貪婪則相反,總是嘗試匹配盡可能少的字符。在"*","?","+","{m,n}"后面加上?,使貪婪變成非貪婪。
 
>>> s="This is a number 234-235-22-423"
>>> r=re.match(".+(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'4-235-22-423'
>>> r=re.match(".+?(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'234-235-22-423'
>>>

  

 正則表達式模式中使用到通配字,那它在從左到右的順序求值時,會盡量“抓取”滿足匹配最長字符串,在我們上面的例子里面,“.+”會從字符 串的啟始處抓取滿足模式的最長字符,其中包括我們想得到的第一個整型字段的中的大部分,“\d+”只需一位字符就可以匹配,所以它匹配了數字“4”,而“.+”則匹配了從字符串起始到這個第一位數字4之前的所有字符。
  解決方式:非貪婪操作符“?”,這個操作符可以用在"*","+","?"的后面,要求正則匹配的越少越好。
 
  下面這個例子仔細體會下
 
>>> re.match(r"aa(\d+)","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
'2'
>>> re.match(r"aa(\d+)ddd","aa2343ddd").group(1) 
'2343'
>>> re.match(r"aa(\d+?)ddd","aa2343ddd").group(1)
'2343'
>>>

  

header">([\s\S]+?)sep20
匹配任何包括換行空白字符等, 非貪婪模式
header">([\s\S]+)sep20
匹配任何包括換行空白字符等, 貪婪模式

 

 

除開某字符

void main() {

RegExp re = RegExp('<((?!P|\/P).*?)>');
String xx = '12<P xx>a</P haha)>b<haha>c';
String yy = xx.replaceAll(re, '');
print(yy);

}



匹配包括換行符在內的任意字符,以下為正確的正則表達式匹配規則: ([\s\S]*) 同時,也可以用“([\d\D]*)”“([\w\W]*)” 來表示。

在文本文件里, 這個表達式可以匹配所有的英文:[ -~]

這個表達式可以匹配所有的非英文(比如中文):  [^ -~]

 

 

下面這個換行可以了.

main(){
  String a = '''
  a
  b
  c
  a
  d
  d
  ''';
  RegExp xx = RegExp("b([^]*)a");
  var aa = xx.allMatches(a).toList();
  print(aa);
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM