2013-07-31 65 views
0

我有存儲在一個變量的項目列表如下圖所示:是否接受正則表達式模式中的範圍的特殊字符?

listitems = ['<a href=\"\/other\/end\/f1\/738638\/adams\">Adams<\/a>\n', '<a href=\"\/other\/end\/f1\/23138\/donovan-smith\">Donovan Smith<\/a>\n'] 

我想找到的人的名字,在我的例子中,名稱是「亞當斯」和「多諾萬史密斯」,但是我需要幫助接受模式中的特殊字符,通常你會使用反斜槓,但我想知道是否有一種方法來接受多個特殊字符一次不插入多個反斜槓

我也想通配符(忽略)獨特數字和名稱,例如:23138和'donovan-smith'

我目前的格局如下所示:

pattern1 = re.compile('<a href=\"\/other\/end\/f1\/23138\/donovan-smith\">(.*?)<\/a>\n') 

任何幫助將非常感激。

+1

爲什麼正斜槓前有反斜槓? – Blender

+2

您可能需要這些正則表達式的[raw strings](http://docs.python.org/2/library/re.html)。 – user2357112

+0

@Blender我的數據在「listitems」下自動導入格式。我無法控制這些數據。 – Ryflex

回答

2

如果你正在做的是解析HTML,爲什麼不試試BeautifulSoupmechanizelxml.html

例如,

import lxml.html 

listitems = ['<a href=\"\/other\/end\/f1\/738638\/adams\">Adams<\/a>\n', '<a href=\"\/other\/end\/f1\/23138\/donovan-smith\">Donovan Smith<\/a>\n'] 

string = ' '.join(listitems) 

page = lxml.html.fromstring(string) 

a_tags = page.cssselect('a') 

names = [] 
for tag in a_tags: 
    names.append(tag.text_content().strip()) 

print names 
['Adams', 'Donovan Smith'] 

會給你你想要的東西。另外,你可以根據它們的xpaths,css等對你選擇的標籤進行微調。

但是如果你真的想自己去寫你的正則表達式,你不用從更簡單的東西開始,

PATTERN = re.compile(r'<a.*?">(.*?)<\\/a>') 

所以:

import re 

listitems = ['<a href=\"\/other\/end\/f1\/738638\/adams\">Adams<\/a>\n', '<a href=\"\/other\/end\/f1\/23138\/donovan-smith\">Donovan Smith<\/a>\n'] 

PATTERN = re.compile(r'<a.*?">(.*?)<\\/a>') 

names = [] 
for item in listitems: 
    n = re.search(PATTERN, item).group(1) 
    names.append(n) 

print names 
['Adams', 'Donovan Smith'] 
+0

感謝您的回覆,我已經看過美麗的湯,但它似乎並沒有爲我工作。 我正在使用mechanize從json文件中獲取數據,直接訪問json,它的格式與我的「listitems」格式相同,所有raw/n格式和html都可見。 – Ryflex

+1

編輯答案並在那裏添加一個正則表達式。考慮包括一個像re.DOTALL這樣的標誌,點是否與新行匹配。但是,你總是可以將你的列表項轉換爲一個字符串,並將它傳遞給lxml.html(或BS) - 實際上,我所展示的代碼中的'yourfile.html'是一個字符串。 – djas