首页 > 解决方案 > 为什么 re.findall 会这样?(蟒蛇正则表达式)

问题描述

我在 pyhton 中做了一个小程序,它通过一个音乐网站搜索并收集音乐数据。音乐的格式为[artist] - [music name] [music file format]. 一开始我re.search是找某位艺人的(我用了正则表达式,因为上面的音乐信息中还有一些其他的字符和不规则性,找到艺人的唯一指标是-关注艺人)。

不知何故,它不起作用,所以我将其更改为re.findall以防万一,但它仍然不起作用。因为我是 python 的初学者,所以我认为我有什么问题,所以我写了一些测试代码来研究哪里出了问题。这就是我得到的。

已经重新导入

当我更改x字符串(这将是音乐信息)并re.findall再次运行时,它给了我不同的结果(无)。我 100% 认为结果会是一样的。为什么会这样?这可能是我的原始代码不起作用re.serach的原因吗?re.findall

我已经包含了代码以防万一。(使用硒)

idx = 1
while True:
        try:
            hxp1 = "(//h3[@class='entry-title td-module-title']/a)[" + str(idx) + "]" 

            text = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.XPATH, hxp1)))

            # info = eg) 'Michael Jackson - Beat it [FLAC, MP3, WAV]'
            info = text.get_attribute('title') # get 'info' as string
            
            # ARTIST = eg) 'Michael Jackson'
            regex = ARTIST + ' - '
            match = re.findall(regex, info) # or use re.search
            
            # do something with 'match'...

            idx += 1

        except:
            # do something...
            break

标签: pythonregex

解决方案


看来你需要确保你匹配

  • 任何 Unicode 空格(即\s在 Python 3.x 或(?u)\sPython 2.x 中,请参阅re文档:“匹配 Unicode 空格字符(包括[ \t\n\r\f\v],以及许多其他字符,例如许多语言中的排版规则要求的不间断空格) ). ")
  • 任何 Unicode 连字符(请参阅在 Python 中搜索所有 Unicode 连字符变体)。

将所有这些结合到您的正则表达式中:

Minami\s[\u002D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]\s

在您的情况下,如果您只需要支持 en-dash/em-dash/hyhen 字符和任何 Unicode 空白字符,您可以使用

Minami\s[-—–]\s

推荐阅读