簡體   English   中英

正則表達式匹配標點符號,后跟空格,但有一些例外

[英]Regex to match punctuation followed by space with some exceptions

我正在嘗試提出一個匹配標點符號(!,?和。)后跟一個空格的正則表達式。 我不希望以“ Mr。”,“ Mrs。”等稱呼開頭的時間段不匹配...

第一步很簡單: r"[\\?|!|\\.] "

但是我正在為第二部分而苦苦掙扎。 這是我到目前為止的內容: r"(?<=[^(Mr|Ms)])\\. "

第二個與“ radar。”或“ cups。”或“ loom。”之類的不匹配,這很糟糕。 我也很難將這兩個正則表達式合並為一個。

謝謝。

這應該工作:

(?<!(Mr)|(Ms))(?<!(Mrs))[.!?](?=\s|$)

這是一個演示:

In [19]: re.search(r'(?<!(Mr)|(Ms))(?<!(Mrs))[.](?=\s|$))', 'Mrs. Jones!').group(0)
Out[19]: '!'

夫妻之間有一個負面的展望,而空間或EOL則具有正面的展望。

請注意,每個不同長度的單獨稱呼都將需要其后面的外觀。


根據OP的要求進行了編輯:

In [78]: re.search(r'((?<!(Mr)|(Ms))(?<!(Mrs))[.])|([!?])(?=\s|$)', 'Mrs! Jones').group(0)
Out[78]: '!'

這是一個工作的: https : //regex101.com/r/iRNTMY/2

(?<!(Mr|Ms))(?<!(Mrs))[.?!]

對於兩種不同的長度可能性,它兩次使用負向后看。

如果要完整,則需要排除Prof, Dr, Miss, Mrs, Ms, Mr等。

Python的re模塊除了固定寬度的回溯外,不支持其他任何內容。 因此,您需要對每個寬度進行多次回溯:

r'(?<!\bMr|\bDr)(?<!Mrs)(?<!\bProf|\bMiss)([.,;])(?= |\n|\Z)'

演示版

或使用允許可變寬度回溯斷言的regex模塊 然后,您可以執行以下操作:

r'(?<!\bMr|\bMrs|\bDr|\bMiss|\bProf)([.,;])(?= |\n|\z)'

演示版


旁注:字符類中的所有內容都匹配單個字符 這就是為什么使用[^(Mr|Ms)]會得到意外結果的原因,這是集合Mrs|()單個字符的否定字符類

演示版

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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