在多行中拆分正则表达式时 - 它会停止工作

时间:2014-01-29 10:57:44

标签: python regex split

我有很多正则表达式,有许多或|或|或:

re.findall(u'\W\s[A-Z]$|(com.|d\.)|\(?adj.\)?|(all\.$)|^(Pays|région|lieu-dit|chef-
lieu|canal|collégiale|ruisseau|bâtiment|hôpital|roi de|(bailliage|canton)(s?))|site|afflu(a|e)nt|forêt|village|église|état(s?)',
su)

我试图用\:

分开
re.findall(u'\W\s[A-Z]$\
      |(com.|d\.) \
      |\(?adj.\)? \
      |(all\.$) \
      |^(Pays|région|lieu-dit \
      |chef-lieu 
       etc

当我像这样拆分时 - 它会停止工作,但是Spyder没有发现任何错误 - 它只是停止输出。

1 个答案:

答案 0 :(得分:2)

您在行的开头以及某些行的末尾引入了空格:

>>> u'\W\s[A-Z]$\
...       |(com.|d\.) \
...       |\(?adj.\)? \
...       |(all\.$) \
...       |^(Pays|région|lieu-dit \
...       |chef-lieu '
u'\\W\\s[A-Z]$      |(com.|d\\.)       |\\(?adj.\\)?       |(all\\.$)       |^(Pays|r\xe9gion|lieu-dit       |chef-lieu '

如果要将字符串拆分为多个源行,请使用连续的字符串:

re.findall(u'\W\s[A-Z]$'
         u'|(com.|d\.)'
         u'|\(?adj.\)?'
         u'|(all\.$)'
         u'|^(Pays|région|lieu-dit'
            u'|chef-lieu|canal|collégiale|ruisseau|bâtiment|hôpital'
            u'|roi de|(bailliage|canton)(s?))'
         u'|site|afflu(a|e)nt'
         u'|forêt|village|église|état(s?)',
    sn
)

Python将在编译时自动为您加入:

>>> (u'\W\s[A-Z]$'
...          u'|(com.|d\.)'
...          u'|\(?adj.\)?'
...          u'|(all\.$)'
...          u'|^(Pays|région|lieu-dit'
...             u'|chef-lieu|canal|collégiale|ruisseau|bâtiment|hôpital'
...             u'|roi de|(bailliage|canton)(s?))'
...          u'|site|afflu(a|e)nt'
...          u'|forêt|village|église|état(s?)')
u'\\W\\s[A-Z]$|(com.|d\\.)|\\(?adj.\\)?|(all\\.$)|^(Pays|r\xe9gion|lieu-dit|chef-lieu|canal|coll\xe9giale|ruisseau|b\xe2timent|h\xf4pital|roi de|(bailliage|canton)(s?))|site|afflu(a|e)nt|for\xeat|village|\xe9glise|\xe9tat(s?)'

或者使用详细的正则表达式语法:

re.findall(u'''
      \W\s[A-Z]$
     |(com.|d\.)
     |\(?adj.\)?
     |(all\.$)
     |^(Pays|région|lieu-dit
        |chef-lieu|canal|collégiale|ruisseau|bâtiment|hôpital
        |roi de|(bailliage|canton)(s?))
     |site|afflu(a|e)nt
     |forêt|village|église|état(s?)''', su, flags=re.VERBOSE)

re.VERBOSE标志会将解析器更改为忽略所有文字空格;解析上面的表达式,就好像所有空格,制表符和换行符都不存在一样。对于某一行的任何#条评论也会从#转换为换行符。