如何创建正则表达式模式以将字符从各种结构的字符串列表中拉出?

时间:2019-05-24 21:25:59

标签: python regex python-regex

我正在使用正则表达式从地址字符串中拉出字母“ u”,但是仅当它被用作缩写(u,u。,U,U。等)时。但是,我正在运行的问题是我拥有的字符串列表比较混乱,并且充满了错误。我已经尝试过从数据中看到的各种错误中提取所需的信息。我知道我一定会缺少一些小东西,但我们会提供任何帮助。

我已经尝试过以下正则表达式:

  • (\ s(u | U)?。?,?。?\ s)<-似乎有点时髦
  • [^ \ w +] [uU]
  • [^ \ w +] [uU] [^ tca]

我还有另一种解决此问题的方法,那就是将地址拆开(在街道,数字等之间分割),然后固定街道部分并将其重新粘在一起。我确实有一点运气,只是把数字部分抽出来了:

  • (\ d +-\ d + | \ d + / * \ w * |(-))

但是,我想看看我在选择“ 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”。

在大多数情况下,我希望结果是:

  • 小伙子u。 5 / a -----> Holics utca 5 / a

最后一点,我有一些删除句点和空白的函数。

1 个答案:

答案 0 :(得分:1)

您可以使用

re.sub(r'\b[uU](?=\b|\d)\.?\s*', 'utca ', s)

详细信息

  • \b-单词边界
  • [uU]-uU
  • (?=\b|\d)-当前位置的右侧必须紧接单词边界或数字
  • \.?-可选点
  • \s*-超过0个空格。

或者,您可以使用

re.sub(r'\b[uU](?=\b|(?![^\W\d_]))\.?\s*', 'utca ', s)

请参见regex demoanother regex demo

在这里,如果下一个字符是字母,则(?![^\W\d_])会失败,而不是数字要求。