我试图搜索漫画书标题及其各自的数字,from this site.
但是我遇到了以前从未使用过的Regex问题。 我不想用我的完整代码给你烦恼,只要我说我使用美丽的汤,我需要的正则表达式只是指向标题名称以及每个漫画标题的剧集编号,循环通过列表。
从网页上可以看出这应该是简单的,发布者名称全部大写,后面跟着标题,后面跟着#-symbol,后面跟着剧集编号。
这是我的方法:
import re
text = "876876 PUBLISHER title #345 jklhljhljh"
texpat = re.compile(r"PUBLISHER(.*?)#")
thename = pattern.search(text)
name = thename.group()
numpat = re.compile(r"#(\d+)")
num = numpat.search(text)
print(name)
print(num.group())
输出结果为:
PUBLISHER title #
#345
但它应该是:
title
345
我可以使用替换字符串方法删除我不想要的东西,但后来我不知道这个输出:
title
和name.strip()或name.lstrip()不会删除额外的三个空格。 已经很晚了,我以前从未使用过正则表达式,我确定我做了些蠢事。
答案 0 :(得分:2)
我会在这里使用BeautifulSoup
来帮助解析html:
import urllib2
from bs4 import BeautifulSoup
url = "http://www.comiclistdatabase.com/doku.php?id=comiclist_for_09_10_2014"
soup = BeautifulSoup(urllib2.urlopen(url))
for row in soup.select('div.table tr')[1:]:
publisher = row.find('td', class_='col1').text
title = row.find('td', class_='col2').text
print {'publisher': publisher, 'title': title}
打印:
{'publisher': u'AMIGO COMICS', 'title': u'Ghost Wolf #4 (Of 4)$3.99 '}
{'publisher': u'AMIGO COMICS', 'title': u'Rogues Volume 2 Cold Ship #4 (Of 5)'}
{'publisher': u'ARCHIE COMIC PUBLICATIONS', 'title': u'Archie Giant Comics Digest TP'}
{'publisher': u'ARCHIE COMIC PUBLICATIONS', 'title': u'Betty And Veronica #272 (Dan Parent Regular Cover)'}
...
然后,如果您想要提取它,也可以从标题中获取数字。我使用#(\d+)
正则表达式匹配一个哈希标签后跟一个或多个数字,括号帮助capture数字:
import re
import urllib2
from bs4 import BeautifulSoup
url = "http://www.comiclistdatabase.com/doku.php?id=comiclist_for_09_10_2014"
soup = BeautifulSoup(urllib2.urlopen(url))
NUMBER_RE = re.compile('#(\d+)')
for row in soup.select('div.table tr')[1:]:
publisher = row.find('td', class_='col1').text
title = row.find('td', class_='col2').text
match = NUMBER_RE.search(title)
number = match.group(1) if match else 'n/a'
print {'publisher': publisher, 'title': title, 'number': number}
打印:
{'publisher': u'AMIGO COMICS', 'number': u'4', 'title': u'Ghost Wolf #4 (Of 4)$3.99 '}
{'publisher': u'AMIGO COMICS', 'number': u'4', 'title': u'Rogues Volume 2 Cold Ship #4 (Of 5)'}
{'publisher': u'ARCHIE COMIC PUBLICATIONS', 'number': 'n/a', 'title': u'Archie Giant Comics Digest TP'}
...
答案 1 :(得分:1)
import re
text = "876876 PUBLISHER title #345 jklhljhljh"
texpat = re.compile(r"PUBLISHER\s*(\S.*?)#")
thename = texpat.search(text)
name = thename.groups()[0]
numpat = re.compile(r"#(\d+)")
num = numpat.search(text)
print(name)
print(num.groups()[0])
输出结果为:
title
345
答案 2 :(得分:1)
匹配此项以使用一个表达式捕获标题(在第一组中)和数字(在第二组中):
PUBLISHER\s*(.+?)\s*#(\d+)
然后你需要使用数组pattern.search(text).group(i)
来获取捕获组而不是整个匹配:
import re
text = "876876 PUBLISHER title #345 jklhljhljh"
pattern = re.compile(r"PUBLISHER\s*(.+?)\s*#(\d+)")
results = pattern.search(text)
print(results.group(1))
print(results.group(2))
输出:
title
345