我正在努力做我的标题所说的。我有一个大约3万个商业地址列表,我试图让每个地址尽可能统一
至于删除奇怪的符号和字符,我找到了三条建议,但我不明白它们是如何不同的。
如果有人能够解释这些差异,或者提供更好的标准化地址信息的方法,请谢谢!
address = re.sub(r'([^\s\w]|_)+', '', address)
address = re.sub('[^a-zA-Z0-9-_*.]', '', address)
address = re.sub(r'[^\w]', ' ', address)
答案 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, -, * .
这似乎是你想要的。每当我使用正则表达式时,我都会使用这个网站:
您可以输入一些输入,并确保它们匹配正确类型的东西,然后将它们放入您的代码中!