【问题标题】:How to create a regex pattern to pull a character out of a list of variously structured strings?如何创建正则表达式模式以将字符从各种结构的字符串列表中提取出来?
【发布时间】:2021-04-08 03:19:13
【问题描述】:

我正在使用正则表达式从地址字符串中提取字母“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”。

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

  • 你好。 5/a -----> Holics utca 5/a

作为最后一点,我有删除句点和空格的函数。

【问题讨论】:

标签: python regex python-re


【解决方案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_]) 会失败,而不是数字要求。

【讨论】:

  • @ivan_pozdeev 1) 它确实匹配 u.,请参阅我的 both 演示。此外,\s* 会修剪右侧的匹配项,因为在替换模式中添加了空格。
  • q 太宽了顺便说一句:stackoverflow.com/questions/56299694/…
  • @ivan_pozdeev 我看不出你在说什么。这些链接不会导致可以在此处使用的任何解决方案。请不要发表带有您的意见的题外话。如果您认为这是一个骗局,请投票结束该问题。请把你的 cmets 移到我的回答中,他们太健谈了,因为他们不相关也不真实。
  • 所以问答不应该涵盖所有具体情况。在您的回答中,(?=\d) 部分由stackoverflow.com/a/25653966/648265 覆盖,stackoverflow.com/a/52392221/648265 是比\s* 破解更清洁的解决方案。
  • @ivan_pozdeev 同样,这是 您的选择,它一点也不复杂:[^\W\d_] 是一个著名的 Python 正则表达式结构,可以匹配任何字母。 (?![^\W\d_]) 仅表示“后面没有字母”。尽可能清洁和高效。
猜你喜欢
  • 2021-10-19
  • 2014-08-25
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
相关资源
最近更新 更多