2015-08-13 83 views
2

我想將單個字母后的句子分開;所以t.成爲t & p.m.變得pm。如果這種情況發生>連續1次,我想刪除發生在它們之間的空格;所以e. g.變成eg。如果single letter + period連續出現超過1次,然後是1-2個空格,並且資本保持該期限,除非資金之後是期限。後單個字母(不管情況)從縮寫(單個字母+句點)開始的替代句點,除非後面跟着大寫字母

  • 子溢出週期
  • 獲取> 2次出現之間。如果在一排,接着1-2位和資本保持發生> 1時去掉可選的空間
  • 期間
    • 除非資本之後一段

MW Ë

x <- "Mr. Brown comes! I met at 7:30 p. m. I will go at 5 a.m. eastern time or @ 2 p. m. I live in the U. S. A. I met John P. Jones later." 

# my attempts 
gsub("(?<=(\\b[A-Za-z]))(\\.)(?! {1,2}[A-Z])", "", x, perl = TRUE) 
gsub("(?<=(\\b[A-Za-z]))(\\.)(?! ??[A-Z])", "", x, perl = TRUE) 

期望的結果

"Mr. Brown comes! I met at 7:30 pm. I will go at 5 am eastern time or @ 2 pm. I live in the USA. I met John P Jones later." 
+0

如果我正確了您的規則,不應該'P.瓊斯'仍然是一樣的,不會改變爲'瓊斯'? – ndn

+0

我支持建議在'P'之後保留'P'後的時間段。 Jones'。 https://ideone.com/Omko9b怎麼樣? –

+0

@ndn我認爲'如果發生> 1次'涵蓋這個,但我可能沒有解釋清楚。 –

回答

3

試試這個正則表達式:

(?:(?<=[a-z])\.\s(?=[a-z]\.))|(?:(?<=[a-z])\.)(?!(?:\s[A-Z]|$)|(?:\s\s))|(?:(?<=[A-Z])\.\s(?=[A-Z]\.))|(?:(?<=[A-Z])\.(?=\s[A-Z][A-Za-z]))

Regex live here.

當R使用:

"(?:(?<=[a-z])\\.\\s(?=[a-z]\\.))|(?:(?<=[a-z])\\.)(?!(?:\\s[A-Z]|$)|(?:\\s\\s))|(?:(?<=[A-Z])\\.\\s(?=[A-Z]\\.))|(?:(?<=[A-Z])\\.(?=\\s[A-Z][A-Za-z]))"

+0

這確實有效。如果人們有更高效的正則表達式,我會延遲檢查。謝謝。 –

+1

我認爲用\ p {L}','\ p {Lu}'和'\ b'可以提高效率。 –

+0

@stribizhev。我也認爲我的解決方案不是更好。我回答只是讓它起作用。但我會很高興看到其他方式。 –

相關問題