我正在学习如何使用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)']
即使我键入这个,我也可以看到我使用的连字符和文本上的连字符是不同的。我确信这就是问题所在,我希望有人能告诉我这个特殊的符号叫什么,以及我如何用键盘“键入”它
谢谢你
我建议增强模式以搜索最常见的连字符
-
、–
和—
,并将present
模式从字符类固定到字符序列(以便不将sent
与[ Ppresent]*
匹配):参见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)
相关问题 更多 >
编程相关推荐