我有一個正則運算式模式如下:
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',
'']
我想要的輸出是:
['This is the U.A. we have r.a.d. golden 13.56 date',' a better date 34. was there',
'']
我不知道如何修改模式以保留單詞“date”和“there”的最后一個字母
uj5u.com熱心網友回復:
您的模式可以簡化為并固定為
(?<=(?<![.\s])[a-zA-Z])\.
請參閱正則運算式演示。
如果您還需要匹配多個點,請 在\..
詳情:
(?<=(?<![.\s])[a-zA-Z])- 與緊接在前面的位置匹配的正向后視(?<![.\s])- 如果.當前位置的左側有一個或空格,則匹配失敗的負向后視[a-zA-Z]- 一個 ASCII 字母
\.- 一個字面點。
看,您的模式基本上是兩種模式的交替,(?<!\.|\s)[a-z]\.而 和(?<!\.|\s)[A-Z]\.之間的唯一區別是[a-z]和[A-Z]。很顯然,同樣的交替可以縮短到(?<!\.|\s)[a-zA-Z]\.的[a-zA-Z]必須付諸非消費模式,這樣的字母不能吃起來的時候分裂,所以使用正回顧后是一個自然的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376320.html
