我正在使用正则表达式从地址字符串中拉出字母“ u”,但是仅当它被用作缩写(u,u。,U,U。等)时。但是,我正在运行的问题是我拥有的字符串列表比较混乱,并且充满了错误。我已经尝试过从数据中看到的各种错误中提取所需的信息。我知道我一定会缺少一些小东西,但我们会提供任何帮助。
我已经尝试过以下正则表达式:
我还有另一种解决此问题的方法,那就是将地址拆开(在街道,数字等之间分割),然后固定街道部分并将其重新粘在一起。我确实有一点运气,只是把数字部分抽出来了:
但是,我想看看我在选择“ u”的正则表达式中所处的位置。 Regex101.com一直是我最好的朋友,没有它我不会走那么远。
test_strings = [
"Holics u 5/a",
"Holics U 5/a",
"Holics u5/a",
"Huolics u 5/a",
"Holics u. 5/a",
"Holuics u5",
"Holics and other stuff u more stuff after 5",
"Houlics utca 5"
]
# two regex patterns I have considered
print("First regex pattern ------------------------------------")
pattern = r"[^\w+][uU]"
replacement_text = " utca "
for item in test_strings:
print(re.sub(pattern,replacement_text,item))
print("\nSecond regex pattern ------------------------------------")
pattern = r"[^\w+][uU][^tca]"
replacement_text = " utca "
for item in test_strings:
print(re.sub(pattern,replacement_text,item))
以上代码的结果:
第一个正则表达式模式:
Holics utca 5/a
Holics utca 5/a
Holics utca 5/a
Huolics utca 5/a
Holics utca . 5/a
Holuics utca 5
Holics and other stuff utca more stuff after 5
Houlics utca tca 5 # <-------------------------------- issue
第二个正则表达式模式:
Holics utca 5/a
Holics utca 5/a
Holics utca /a # <----------------------------------- issue
Huolics utca 5/a
Holics utca 5/a
Holuics utca <-------------------------------------- issue
Holics and other stuff utca more stuff after 5
Houlics utca 5
除第一个正则表达式模式中的最后一行(“ Houlics utca tca 5”)外,其他所有方法都有效,并且当我尝试创建一个表达式以同时考虑包含“ utca”的字符串时,我会迷失字符串中的数字例如“ Holics u5 / a”。
在大多数情况下,我希望结果是:
最后一点,我有一些删除句点和空白的函数。
答案 0 :(得分:1)
您可以使用
re.sub(r'\b[uU](?=\b|\d)\.?\s*', 'utca ', s)
详细信息
\b
-单词边界[uU]
-u
或U
(?=\b|\d)
-当前位置的右侧必须紧接单词边界或数字\.?
-可选点\s*
-超过0个空格。或者,您可以使用
re.sub(r'\b[uU](?=\b|(?![^\W\d_]))\.?\s*', 'utca ', s)
请参见regex demo和another regex demo。
在这里,如果下一个字符是字母,则(?![^\W\d_])
会失败,而不是数字要求。