2016-11-08 27 views
1

我對正則表達式不太擅長,它每次出現時都會讓我困惑,所以我不想寫一個可能不正確的正則表達式字符串,而是想以不同的方式分割一個字符串。在Python中分割所有東西但是特定的一組例子

比方說,我有一個字符串「你好,我的名字是約瑟夫!哈哈,你好!」當我遇到非字母數字字符時,我想分割它。那麼,在這種情況下,我將獲得:

「你好」 「我」 「名」 「是」 「約瑟夫」 「哈哈」 「你好」

是否有辦法沒有正則表達式字符串呢?如:在字符分割時!=字母數字?

(是的,我知道這可能不是做不正確我正則表達式缺乏一個聰明的做法!)

+2

嘛,我看不出這裏使用非常簡單,直接的正則表達式,'re.split(R'的任何問題\ W +',S)',或者另一個,'re.findall(r'\ w +',s)' –

+0

或者s.split()讓你['hello','my','name','是','約瑟夫','哈哈','你好!'],你可以很容易地修復。或s.replace(「!」,「」).split,它給出['hello','my','name','is','Joseph','哈哈','hello'] –

+0

是,可能有幾種方法。它會通過不使用正則表達式使其更具可讀性或更好的方法?可能不會。 –

回答

1

就個人而言,我認爲這是適當的使用這種簡單的任務簡單而直接的正則表達式。

比較的itertools重新解決方案:

import itertools, re 
s = "hello, my name is Joseph! Haha, hello!" 
print(["".join(x) for _, x in itertools.groupby(s, key=str.isalnum)][0::2]) 
print(re.findall(r"\w+", s)) 

看到online Python demo here

至於我,我會在這裏爲正則表決投票。 \w+匹配一個或多個單詞字符(字母,數字,下劃線),並返回所有不重疊的事件。

迭代工具groupby根據被設置到字母數字(str.alnum)和所有偶數令牌(在這個具體的例子,非字組塊)的key組的子塊從與[0::2]最終結果中移除。如果一個字符串以非單詞字符開頭,這將不起作用,正則表達式解決方案更安全,更容易。

0

當有人試圖avoid using regex ;我總是很高興;)但是這裏可能是最好的工具。

你可以寫你自己的解析器,但更加詳細:

s = "hello, my name is Joseph! Haha, hello!" 
words = [] 
lasti = 0 
lastp = False 
for i,p in enumerate (not c.isalpha() for c in s): 
    if p != lastp: 
     if p: words.append (s[lasti:i]) 
     lasti, lastp = i,p 

print (', '.join (words)) 
相關問題