我認爲非環視的方式將更有效率和可讀性:
text="stack overflow... is a popular website."
gsub("*[[:space:]]*(\\.+)[[:space:]]*", " \\1 ", text)
## => [1] "stack overflow ... is a popular website . "
見IDEONE demo
我更新了帖子,因爲是需要空間之前和標點之後。
圍繞(\\.+)
匹配零個或多個空格,並且(\\.+)
將匹配一個或多個句點。 (...)
形成一個捕獲組,它的值存儲在編號緩衝區#1中,我們可以使用來自替換模式的反向引用訪問它。因此,\1
將被模式捕獲的時段替換。由於在當前位置之前/之後沒有檢查文本的開銷,所以捕獲比使用周邊查找效率更高。現在
,如果你需要處理所有的標點,使用[[:punct:]]
:
gsub("[[:space:]]*([[:punct:]]+)[[:space:]]*", " \\1 ", text)
見R regex help:
[:punct:]
標點符號:
! " # $ % & ' () * + , - ./: ; < = > ? @ [ \ ]^_ ` { | } ~.
Code demo:
text="Hi!stack overflow... is a popular website, I visit it every day."
gsub("[[:space:]]*([[:punct:]]+)[[:space:]]*", " \\1 ", text)
## => [1] "Hi ! stack overflow ... is a popular website , I visit it every day . "
更新連字符的單詞
爲了避免匹配連字符的話,你可以匹配和跳過了與單詞邊界包圍了-
:
text="Hi!stack-overflow... is a popular website, I visit it every day."
gsub("\\b-\\b(*SKIP)(*F)|\\s*(\\p{P}+)\\s*", " \\1 ", text, perl=T)
## => [1] "Hi ! stack-overflow ... is a popular website , I visit it every day . "
請參閱demo
''GSUB不...(或'GSUB( 「([[:punct:]] +)」,「\\ 1」,text,fixed = FALSE)'對於任何類型的標點符號) – Cath
只有句點,其他標點符號呢? –
@stribizhev所有標點符號應與單詞分開,但省略號應被視爲單個實體,並且在過程中不得分開 – Antoine