2014-04-01 34 views
0

因此,我在Python中使用了這個字符串str = u'world-weather-online®_jkpahjicmehopmlkbenbkmckcedlcmhk',我只是想用正則表達式提取world-weather-online®的一部分。我所做的是第一個match = re.search(r'([a-zA-Z0-9\-\%\+]+?)_[a-z]+', str),然後在字符串str2 = match.group(1)中得到結果。如何處理在Python中具有unicode的正則表達式?

但是,我結束了錯誤'NoneType' object has no attribute 'group'。如果我只是用字符串「world-weather-online_jkpahjicmehop​​mlkbenbkmckcedlcmhk」來嘗試它,它就可以正常工作。但是,擁有特殊的unicode符號會產生問題。我嘗試使用match = re.search(ur'([a-zA-Z0-9\-\%\+]+?)_[a-z]+', str),但它仍然沒有幫助。關於如何解決這個問題的任何想法?謝謝!

+0

你的意思是你有一個*字節串*同是ASCII範圍之外的代碼點?或者你有* unicode *字符串對象('u'world-weather-online®_jkpahjicmehop​​mlkbenbkmckcedlcmhk')? –

+0

沒有*特殊的Unicode符號*;所有文本都是unicode代碼點,其中大部分都在ASCII範圍內。 –

+0

我有一個Unicode字符串對象。 – TheRookierLearner

回答

3

使用Unicode正則表達式,包括在你的模式碼點:

match = re.search(ur'([a-zA-Z0-9®%+-]+?)_[a-z]+', yourstr) 

你可能要考慮關於除了商標®碼點之外應該包括哪些其他碼點。

演示:

>>> import re 
>>> yourstr = u'world-weather-online®_jkpahjicmehopmlkbenbkmckcedlcmhk' 
>>> print re.search(ur'([a-zA-Z0-9®%+-]+?)_[a-z]+', yourstr).group(1) 
world-weather-online® 
+0

當我在命令行上試試這個時,我得到了「 」字符 – TheRookierLearner

+0

@ TheRookierLearner:你確定*你的'yourstr'輸入值是'unicode'對象嗎?你如何打印輸出? –

+0

我實際上使用'yourstr ='world-weather-online®_jkpahjicmehop​​mlkbenbkmckcedlcmhk''而不是'yourstr = u'world-weather-online®_jkpahjicmehop​​mlkbenbkmckcedlcmhk''但我沒有區別。我實際上是從數據庫中獲取這個值(可能這就是爲什麼它不起作用),我認爲Python總是將它的字符串存儲在unicode中。 – TheRookierLearner

2

嗯,我認爲你只是忘了®在你的正則表達式:

>>> match = re.search(r'([a-zA-Z0-9\-\%\+®+]+?)_[a-z]+', str) 
>>> match.group(1) 
u'world-weather-online\xae' 

但是,如果你的字符串包含更多的Unicode字符,你的正則表達式可能會很長......所以只是re.search(r'(.*)_[a-z]+', str)可以做的伎倆。

如果你只是想WRT拆分,以「_」:

>>> str.split('_')[0] 
u'world-weather-online\xae' 
+0

OP使用什麼編碼?如果他們使用UTF-8會怎麼樣?還是IBM 850編解碼器? –

+0

這適用於Python命令行,但是當我將這些行保存在文件中時,我會在文件中獲得'非ASCII字符'\ xc2'。有關如何將其保存在文件中的任何想法? – TheRookierLearner

相關問題