簡體   English   中英

python 正則表達式:僅匹配點,而不是前面的字母

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM