[英]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]: '!'
如果要完整,則需要排除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.