【问题标题】:Python Regular Expression to find single letter Cardinal DirectionPython正则表达式查找单个字母基本方向
【发布时间】:2020-12-16 08:49:31
【问题描述】:

我有一个来自家乡(休斯顿)的街道名称字符串,如下所示:

  • 'FM 517 W'
  • 'FM E 42nd'
  • 'N 凯蒂高速公路'

我正在尝试创建一个正则表达式来查找单个字母的基本方向(N、S、E 或 W)并将它们替换为完整的单词(North、South、East 或 West)。

这是我目前写的代码:

single_cardinals = re.compile(r'[NnSsEeWw]+(/s)')

不幸的是,它没有选择上面列出的任何字符串。正则表达式适用于 regexpal.com :(

感谢您的所有帮助! `

【问题讨论】:

  • 请显示您尝试使用正则表达式搜索示例列表的代码。包括示例,并显示结果。
  • 您的主要字母并不总是后跟空格。也许看看单词边界匹配?此外,+ 是一种非常生硬的工具,因为虽然是的,它允许匹配 NE,但也允许匹配 Ss - 枚举所有可能的基点并不难,是吗?如果可以的话,再完善它。
  • 感谢您的帮助,我相信“+”干扰了我的括号搜索。我实际上没有任何 NW、NE 等字符。只有4个基本的。我已将其更新为 3 个问题:找到红衣主教是在末尾、开头还是中间。这是我生成的代码,它可以工作:end = re.compile(r'( |^)[NnSsEeWw]$')middle = re.compile(r'( )[NnSsEeWw]( ))beginning = re.compile(r'(^)[NnSsEeWw]( ))

标签: python


【解决方案1】:

您要查找的是\b 字边界分隔符,请参阅this doc

正则表达式非常酷,因此在这里发布一个示例,说明如何建立一些良好的基础,以便在未来更好地利用它们。

在下面的示例中,我将字符串分成 3 个可匹配部分:(.*)\b([NnSsEeWw])\b(.*)

  • (.*) 捕获它可以捕获的所有内容(注意:您可以将其更改为 (.*?),问号将使正则表达式匹配尽可能小的字符串而不是尽可能大的字符串 - 这将使 first 将找到 NSEW 字母而不是 last - 您可以使用像 FM W 517 W 这样的虚构地址来测试边缘情况,例如使用 2 W-s 来查看与哪个匹配两种变体)
  • \b 用作单词边界(意思是:后面的内容不能在单词内)
  • 然后您的[NnSsEeWw] 被捕获
  • 最后是另一个 (.*) 中的其余文本
import re


single_cardinals = re.compile(r"(.*)\b([NnSsEeWw])\b(.*)")
long_cardinals = {"N": "North", "S": "South", "E": "East", "W": "West"}


def expanded_cardinals(text):
    m = single_cardinals.match(text)
    if m:
        short = m.group(2).upper()
        if short in long_cardinals:
            expanded = (m.group(1), long_cardinals[short], m.group(3))
            text = "".join(expanded)

    return text


print(expanded_cardinals("FM 517 W"))
print(expanded_cardinals("FM E 42nd"))
print(expanded_cardinals("N Katy Freeway"))
print(expanded_cardinals("Montgomery"))

【讨论】:

  • 这正是我要找的!你的解释很漂亮,帮助很大,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
相关资源
最近更新 更多