[英]python regex: match the dot only, not the letter before it
我有一個正則表達式模式如下:
r'(?:(?<!\.|\s)[a-z]\.|(?<!\.|\s)[A-Z]\.)+'
我正在嘗試修改它,使其只匹配句子末尾的點,而不是它們前面的字母。 這是我的字符串:
sent = 'This is the U.A. we have r.a.d. golden 13.56 date. a better date 34. was there.'
這就是我所做的:
import re
re.split(r'(?:(?<!\.|\s)[a-z]\.|(?<!\.|\s)[A-Z]\.)+', sent)
然而發生的事情是它刪除了單詞的最后一個字母:
current output:
['This is the U.A. we have r.a.d. golden 13.56 dat',' a better date 34. was ther',
'']
我想要的 output 是:
['This is the U.A. we have r.a.d. golden 13.56 date',' a better date 34. was there',
'']
我不知道如何修改模式以保留單詞“date”和“there”的最后一個字母
您的模式可以簡化為並固定為
(?<=(?<![.\s])[a-zA-Z])\.
請參閱正則表達式演示。
如果您還需要匹配多個點,請在\.
后面放回+
。 .
詳情:
(?<=(?<.[.\s])[a-zA-Z])
- 與緊接在其前面的位置匹配的正向后視
(?<.[.\s])
- 如果有.
或緊鄰當前位置左側的空格[a-zA-Z]
- 一個 ASCII 字母\.
- 一個字面點。 看,您的模式基本上是兩種模式的交替, (?<.\.|\s)[az]\.
和(?<.\.|\s)[AZ]\.
,唯一的區別是[az]
和[AZ]
。 很明顯,相同的交替可以縮短為(?<.\.|\s)[a-zA-Z]\.
必須將[a-zA-Z]
放入非消耗模式,這樣在拆分時字母就不會被吃掉,因此使用正向后視是一種自然的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.