2016-04-09 79 views
0

在Python中我有一個字符串的項目列表,看起來像:正則表達式替代HTML HREF和U標籤(蟒蛇)

My website is <a href="WEBSITE1" target='_blank'><u>WEBSITE1</u></a> 
The link is <a href="LINK1" target='_blank'><u>LINK1</u></a> 
... 

我想要做的是替代(在每一個列表項)在href語法只留下鏈接文本,所以我的名單看起來像:

My website is WEBSITE1 
The link is LINK1 
... 

我在想匹配和更換這個表達式:

<a href="(.*?)" target='_blank'><u>(.*?)</u></a> 

附:

(.*?) 

但它不起作用。它似乎很複雜。任何簡單的方法來作爲輸出清單項目的清單對象?

回答

2

您也可以使用HTML解析器處理字符串,例如, BeautifulSoup和它的replace_with() - 查找字符串中的所有a元素,並與鏈接的文本替換它們:

>>> from bs4 import BeautifulSoup 
>>> l = [ 
...  """My website is <a href="WEBSITE1" target='_blank'><u>WEBSITE1</u></a>""", 
...  """The link is <a href="LINK1" target='_blank'><u>LINK1</u></a>""" 
... ] 
>>> for item in l: 
...  soup = BeautifulSoup(item, "html.parser") 
...  for a in soup("a"): 
...  a.replace_with(a.text) 
...  print(str(soup)) 
... 
My website is WEBSITE1 
The link is LINK1 

或者,正如在評論中指出的@ user3100115,剛剛起步的「湯」對象的文本也適用在您的樣本數據:

>>> for item in l: 
... print(BeautifulSoup(item, "html.parser").get_text()) 
... 
My website is WEBSITE1 
The link is LINK1 
+0

我覺得'soup.get_text()'在這裏可以。 – styvane

+0

@ user3100115好點!它也適用於提供的樣本。謝謝。 – alecxe

0

如果我不得不使用正則表達式我會使用類似

<a href.*?><u>(.*?)<\/u><\/a> 

,然後在列表理解

pattern = re.compile('<a href.*?><u>(.*?)<\/u><\/a>') 
print [re.sub(pattern, r"\1", string) for string in my_list] 

取代但是考慮使用beautifulsoup或其它HTML解析器,如指出,其他答案,這將爲您提供更通用的解決方案

正則表達式解釋

  • <a href.*?>匹配的a href標籤,不貪心,到第一個右括號
  • <u>匹配的U標籤
  • (.*?)比賽你想保持
  • <\/u><\/a>比賽結束標記字符串
0

這個正則表達式似乎工作

([^<]+)<a\s+href\s*=\s*"([^"]+).* 

Regex Demo

Python代碼

p = re.compile(r'<a\s+href\s*=\s*"([^"]+).*') 
test_str = ["My website is <a href=\"WEBSITE1\" target='_blank'><u>WEBSITE1</u></a>", "The link is <a href=\"LINK1\" target='_blank'><u>LINK1</u></a>"] 

for x in test_str: 
    print(re.sub(p, r"\1", x)) 

Ideone Demo

0

檢索括號的捕獲組在re.sub

>>>s = """ 
My website is <a href="WEBSITE1" target='_blank'><u>WEBSITE1</u></a> 
The link is <a href="LINK1" target='_blank'><u>LINK1</u></a> 
""" 
>>> re.sub("<a href=\"(.*?)\" target='_blank'><u>(.*?)</u></a>", r'\1', s) 
'\nMy website is WEBSITE1 \nThe link is LINK1 \n' 

確保替換字符串是正確的r轉義字符串,否則它將簡單替換爲\1

由於您的輸入列表(假設它的名字是s):

>>> for i in range(0,len(s)): 
... s[i] = re.sub("<a href=\"(.*?)\" target='_blank'><u>(.*?)</u></a>", r'\1', s[i]) 
>>> s 
['My website is WEBSITE1', 'The link is LINK1'] 

如果經常或大名單上完成的,你可以編譯循環之前的正則表達式。

0

請澄清:你的標題說,除去HTML href標籤,但在你的榜樣,您還刪除了u標籤。

如果我們保證沒有其他HTML標籤(如果我們想要刪除所有標籤),您的答案可以簡化爲au。在這種情況下,我們可以搜索<>之間的任何內容,或者查找<a</a>>之間的任何內容。我的答案假定這個,所以如果不是,它將是無效的。

import re 
S = (
    'My website is <a href="WEBSITE1" target="_blank"><u>WEBSITE1</u></a>', 
    'The link is <a href="LINK1" target="_blank"><u>LINK1</u></a>', 
) 
RE1 = re.compile(r"<\/?[^>]*>") 
RE2 = re.compile(r"<\/?[aA][^>]*>") 
for s in S: 
    s1 = RE1.sub("", s) # remove all tags 
    s2 = RE2.sub("", s) # remove only <a> and </a> tags 
    print (s) 
    print (s1) 
    print (s2) 
    print ("") 

在運行時(python2),它產生

My website is <a href="WEBSITE1" target="_blank"><u>WEBSITE1</u></a> 
My website is WEBSITE1 
My website is <u>WEBSITE1</u> 

The link is <a href="LINK1" target="_blank"><u>LINK1</u></a> 
The link is LINK1 
The link is <u>LINK1</u> 

第一行是原始的字符串,第二個是與所有HTML標籤去除,第三是一個僅有a標記除去。

我沒有包括第三個選擇:只刪除a href標籤。