Python,正则表达式的问题。想找些漫画书的标题

2024-04-24 05:32:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我在努力寻找漫画书的书名和它们各自的数字,from this site.

但我对Regex有意见,我以前从来没用过。 我不想让你厌烦我的全部代码,只要说我用的是漂亮的汤就够了,我从Regex需要的只是指向标题名称和每个漫画标题的集号,从列表中循环通过。你知道吗

从网页上可以看出,这本身就应该很简单,出版商的名字都是大写的,总是跟在标题后面,总是跟在#符号后面,总是跟在插曲号后面。你知道吗

我的方法是:

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

我可以使用replace string方法删除我不想要的东西,但是我会被这个输出卡住:

   title

以及名称.strip()或名称.lstrip()不删除额外的三个空格。 太晚了,我以前从没用过regex,我肯定我在做傻事。你知道吗


Tags: 方法textnamere名称标题searchtitle
3条回答
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

我将在这里使用^{}来帮助进行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+)正则表达式,它匹配一个hashtag,后跟一个或多个数字,括号有助于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'}
...

将此匹配以捕获标题(在第一组中)和数字(在第二组中),并使用一个表达式:

PUBLISHER\s*(.+?)\s*#(\d+)

Demo


然后需要使用数组^{}来获取捕获组,而不是整个匹配:

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

相关问题 更多 >