连字符“”在对BeautifulSoup使用正则表达式时产生问题

2024-05-08 13:20:19 发布

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

我正在学习如何使用Wikepedia文章使用python进行webscrape。我通过对表行()使用.get\u text()方法,成功地获得了所需的数据,即表

我正在清理熊猫的数据,其中一个例行程序是获取一本书或一部电影的出版日期。因为这种情况有很多种发生方式,例如: (1986) (1986-1989) (1986年至今)

目前,我正在使用下面的代码处理测试语句:

# get the first columns of row 19 from the table and get its text
test = data_collector[19].find_all('td')[0]
text = test.get_text()
#create and test the pattern
pattern = re.compile('\(\d\d\d\d\)|\(\d\d\d\d-\d\d\d\d\)|\(\d\d\d\d-[ Ppresent]*\)')
re.findall(pattern, 'This is Agent (1857), the years were (1987-1868), which lasted from (1678- Present)')

我得到了测试句子的预期输出

['(1857)', '(1987-1868)', '(1678- Present)']

然而,当我在维基文章《福尔摩斯历险记》(1891-1892)(系列),(1892)(小说),亚瑟·柯南·道尔(Arthur Conan Doyle)中的一段特定文本上测试它时,我能够提取(1892),但不能提取(1891-1892)

text = test.get_text()
re.findall(pattern, text)
o/p: ['(1892)']

即使我键入这个,我也可以看到我使用的连字符和文本上的连字符是不同的。我确信这就是问题所在,我希望有人能告诉我这个特殊的符号叫什么,以及我如何用键盘“键入”它

谢谢你


Tags: andthe数据textfromtest文本re
1条回答
网友
1楼 · 发布于 2024-05-08 13:20:19

我建议增强模式以搜索最常见的连字符-,并将present模式从字符类固定到字符序列(以便不将sent[ Ppresent]*匹配):

re.compile(r'\(\d{4}(?:[\s–—-]+(?:\d{4}|present))?\)', re.I)

参见regex demo。注意,re.I标志将使regex以不区分大小写的方式匹配

细节

  • \(-a(
  • \d{4}-四个数字({4}是一个限制量词,重复它修改的模式四次)
  • (?:[\s–—-]+(?:\d{4}|present))?-可选的(因为结尾有一个?)非捕获(由于?:)组匹配
    • [\s–—-]+-1个或多个空格、-
    • (?:\d{4}|present)-4位数或present
  • \)-a)字符

如果要匹配任何连字符,请使用[\u002D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D\s]+而不是[\s–—-]+

或者,要匹配该位置的任何1+非单词字符,可能除了(),请使用[^\w()]+re.compile(r'\(\d{4}(?:[^\w()]+(?:\d{4}|present))?\)', re.I)

相关问题 更多 >