日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python正则表达式 re.sub()函数:标志位flags与参数个数问题

發布時間:2025/3/20 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python正则表达式 re.sub()函数:标志位flags与参数个数问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這兩天在寫爬蟲程序,涉及英文文本處理,需要規范化英文標點符號的寫法。正常情況下,英文句號.后面需要保證有且只有一個空格,但也有例外情況,比如i.e.、e.g.、P.S.這種。由于無法預測大小寫,因此在正則表達式中使用了標志位flags,卻死活不生效。

一開始,我的函數是這樣寫的:

def punctuate(s):#----其余代碼暫略s = re.sub(' e. g. ', 'e.g.', s, re.I)return s

代碼的本意是:本來好好的e.g.,被函數前半斷的代碼錯改成e. g.之后,需要修復一下,將英文句號.后面的空格刪掉。但這行 re.sub() 代碼主要有2個問題:

  • e. g.前后不一定是空格,因此這樣寫的話,如果遇到e. g.,或是(e. g. xxx的情況就會被跳過。
  • 英文的句號.未轉義
  • 標志位 re.I不生效

前2個問題好解決。改進代碼如下:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! '''def punctuate(s):#----其余代碼暫略s = re.sub('([^a-zA-Z]e\.) (g\.[^a-zA-Z])', '\g<1>\g<2>', s, re.I)return s

規則是:e. g.之前或之后,必須有非英文字母的字符(包括空格),且e.和g.中間有一個空格,則將中間的空格刪掉,且保留前后的非英文字母(\g<1>表示查找到的第1個括號內的文本,\g<2>表示第2個括號)。但標志位 re.I 的問題還是沒解決。

re.sub(pattern, repl, string, count=0, flags=0)

我傳入的第4個參數 re.I 會被當作是 count。因此,正確的姿勢是明確寫明flags=re.I。

整個標點符號規范化函數還包括其它的替換,完整代碼如下:

def punctuate(s):s = re.sub('([,:;?!\.”\)])', '\g<1> ', s) #后加空格s = re.sub('([“\(])', ' \g<1>', s) #前加空格s = re.sub('([“\(]) ', '\g<1>', s) #后刪空格s = re.sub(' ([,:;?!\.”\)])', '\g<1>', s) #前刪空格s = re.sub('([,\.?!;\)]) ”', '\g<1>”', s) #閉引號前去空格s = re.sub('\) ([,:;?!\.”])', ')\g<1>', s) #閉括號后去空格s = re.sub('(\d)\. (\d)', '\g<1>.\g<2>', s) #小數點后去空格s = re.sub(' +', ' ', s) #多空格改單空格#拉丁加點縮寫單詞,點號后面去空格s = re.sub('([^a-zA-Z]e\.) (g\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('([^a-zA-Z]i\.) (e\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('([^a-zA-Z]q\.) (v\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('([^a-zA-Z]v\.) (s\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('([^a-zA-Z]n\.) (b\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('([^a-zA-Z]p\.) (s\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('\. ,', '.,', s)return s

總結

以上是生活随笔為你收集整理的Python正则表达式 re.sub()函数:标志位flags与参数个数问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。