Python,正则表达式问题。试图刮掉一些漫画书

时间:2014-09-12 00:46:56

标签: python regex

我试图搜索漫画书标题及其各自的数字,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()不会删除额外的三个空格。 已经很晚了,我以前从未使用过正则表达式,我确定我做了些蠢事。

3 个答案:

答案 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+)

Demo


然后你需要使用数组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