查找单字母基数方向的Python正则表达式

查找单字母基数方向的Python正则表达式,python,Python,我有一个字符串,带有我家乡(休斯顿)的街道名称,如下所示: “FM 517 W” ‘FM E 42’ “凯蒂高速公路” 我试图创建一个正则表达式,找到单个字母的基本方向(N、S、E或W),并用完整的单词(北、南、东或西)替换它们 这是我到目前为止编写的代码: single_cardinals = re.compile(r'[NnSsEeWw]+(/s)') 不幸的是,它没有拾取上面列出的任何字符串。regex在regexpal.com上运行:( 谢谢你的帮助! `您要查找的是\b单词边界分

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

  • “FM 517 W”
  • ‘FM E 42’
  • “凯蒂高速公路”
我试图创建一个正则表达式,找到单个字母的基本方向(N、S、E或W),并用完整的单词(北、南、东或西)替换它们

这是我到目前为止编写的代码:

single_cardinals = re.compile(r'[NnSsEeWw]+(/s)')
不幸的是,它没有拾取上面列出的任何字符串。regex在regexpal.com上运行:(

谢谢你的帮助!
`

您要查找的是
\b
单词边界分隔符,请参阅

正则表达式非常酷,因此在这里为您发布一个示例,说明如何在将来更好地利用它们

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

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

请显示您试图使用正则表达式搜索示例列表的代码。包括示例,并显示结果。您的基数字母后面不总是有空格。也许可以看看单词边界匹配?此外+是一个非常钝的工具,因为它允许匹配NE,但也允许匹配Ss-这并不难列举所有可能的基本点,是吗?如果可以的话,再细化它。谢谢你的帮助,我相信“+”干扰我的括号搜索。我实际上没有任何NW,NE等字符。只有4个基本的。我已经更新了3个问题:找到基数,如果它是在结尾,在开始,或在中间。这是我产生的代码,它的工作:<代码>结束= RE。编译(R’(^ ^)[ NSnSW W] $)<代码> >代码>中间=重新编译。(r'()[nnsseew]())
start=re.compile(r'(^)[nnsseew]())
这正是我要找的!你的解释很漂亮,帮助很大,非常感谢!
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"))