从python

时间:2017-04-11 21:26:05

标签: python regex

我正在努力做我的标题所说的。我有一个大约3万个商业地址列表,我试图让每个地址尽可能统一

至于删除奇怪的符号和字符,我找到了三条建议,但我不明白它们是如何不同的。

如果有人能够解释这些差异,或者提供更好的标准化地址信息的方法,请谢谢!

address = re.sub(r'([^\s\w]|_)+', '', address)

address = re.sub('[^a-zA-Z0-9-_*.]', '', address)

address = re.sub(r'[^\w]', ' ', address)

3 个答案:

答案 0 :(得分:1)

第一个建议使用\s\w正则表达式通配符。

\s表示"匹配任何空格"。 \w表示"匹配任何字母或数字"。

这被用作反向捕获组([^\s\w]),它们一起意味着匹配任何不是空格,字母或数字的东西"。最后,使用替代|_合并,它只匹配下划线并给出匹配一次或多次的+量词。

所以这就是:"匹配一个或多个字符的任何序列,这些字符不是空格,字母,数字或下划线,并将其删除"。

第二个选项说:"匹配任何不是字母,数字,连字符,下划线,点或星号的字符并将其删除"。这是由大型捕获组(括号之间的东西)说明的。

第三个选项说"取任何不是字母或数字的东西,并用空格替换它#34;。它使用\w通配符,我已解释过。

所有选项都使用正则表达式以匹配具有某些特征的字符序列,以及re.sub函数, sub - 构成匹配的任何内容由第二个字符串参数给出的正则表达式。

您可以在Python here中阅读有关正则表达式的更多信息。

答案 1 :(得分:1)

枚举[^a-zA-Z0-9-_*.]精确枚举要删除的字符范围(尽管文字-应位于字符类的开头或结尾)。

\w被定义为"字符"在传统的ASCII语言环境中包括A-Z和a-z以及数字和下划线,但在Unicode支持下,它匹配重音字符,西里尔字母,日语表意文字等。

\s匹配空格字符,再次使用Unicode包含许多扩展字符,例如不可破坏的空格,数字空间等。

究竟要选择哪一个显然取决于你想要完成什么以及你的意思是什么"特殊字符"。数字是"符号",所有字符都是"特殊"等。

这是来自the Python re documentation的相关引文:

  

\ S

     
    

对于Unicode(str)模式:

         
      

匹配Unicode空白字符(包括[ \t\n\r\f\v]以及许多其他字符,例如许多语言中排版规则规定的非破坏空格)。如果使用ASCII标志,则仅匹配[ \t\n\r\f\v](但标志会影响整个正则表达式,因此在这种情况下使用显式[ \t\n\r\f\v]可能是更好的选择。)

    
         

对于8位(字节)模式:

         
      

匹配ASCII字符集中考虑空格的字符;这相当于[ \t\n\r\f\v]

    
  
     

\ W

     
    

对于Unicode(str)模式:

         
      

匹配Unicode字符;这包括大多数可以成为任何语言单词的一部分的字符,以及数字和下划线。如果使用ASCII标志,则仅匹配[a-zA-Z0-9_](但标志会影响整个正则表达式,因此在这种情况下使用显式[a-zA-Z0-9_]可能是更好的选择。)

    
         

对于8位(字节)模式:

         
      

匹配ASCII字符集中被认为是字母数字的字符;这相当于[a-zA-Z0-9_]

    
  

答案 2 :(得分:0)

您如何阅读re.sub函数是这样的(more docs):

re.sub(a, b, my_string)  # replace any matches of regex a with b in my_string

我会选择第二个。正则表达式可能很棘手,但是这个说:

[^a-zA-Z0-9-_*.]   # anything that's NOT a-z, A-Z, 0-9, -, * .

这似乎是你想要的。每当我使用正则表达式时,我都会使用这个网站:

http://regexr.com/

您可以输入一些输入,并确保它们匹配正确类型的东西,然后将它们放入您的代码中!

相关问题