首页 > 解决方案 > 正则表达式从字面上匹配缩写的字符

问题描述

我是正则表达式的新手,我需要一些帮助。所以我在下面有一个字符串,我想让我的正则表达式匹配首字母缩写词的第一个字符 + 任何字符 [az] 无限次,但只匹配第一个字符。对于其余的角色,我想按原样匹配它们。任何有关更改我的正则表达式行以实现此目的的帮助,将不胜感激。

import re
s = 'nUSA stands for northern USA'
x = (f'({"nUSA"}).+?({" ".join( t[0] + "[a-z]" + t[1:] for t in "nUSA")})(?: )')
print(x)
out: (nUSA).+?(n[a-z]+ U[a-z]+ S[a-z]+ A[a-z]+)(?: )

我想用我的正则表达式行实现类似于下面的模式,以便它可以匹配美国北部。

(nUSA).+?(n[a-z]+ U + S + A)(?: )

而不是我得到的

(nUSA).+?(n[a-z]+ U[a-z]+ S[a-z]+ A[a-z]+)(?: )

我希望它适用于任何任意文本,而不仅仅是特定文本。我不确定我是否正确表达了我的问题。

标签: pythonregexpython-3.xstringtext

解决方案


您可以使用

import re
s = 'nUSA stands for northern USA'
key='nUSA'
x = rf'\b({key})\b.+?\b({key[0]}[a-z]*\s*{key[1:]})(?!\S)'
# => print(x) => \b(nUSA)\b.+?\b(n[a-z]*\s*USA)(?!\S)
# Or, if the key can contain special chars at the end:
# x = rf'\b({re.escape(key)})(?!\w).+?(?<!\w)({re.escape(key[0])}[a-z]*\s*{re.escape(key[1:])})(?!\S)'
print(re.findall(x, s))
# => [('nUSA', 'northern USA')]

请参阅Python 演示。生成的正则表达式看起来像\b(nUSA)\b.+?\b(n[a-z]*\s*USA)(?!\S),请参阅它的演示。细节:

  • \b- 单词边界
  • (nUSA)- 第一组捕捉关键词
  • \b/ (?!\w)- 单词边界(右手单词边界)
  • .+?- 尽可能少的除换行符之外的任何 1+ 字符
  • \b- 单词边界
  • (n[a-z]*\s*USA) - 第 2 组:(n第一个字符),然后是任何 0+ 个小写 ASCII 字母、0+ 个空格和key字符串的其余部分。
  • (?!\S)- 右侧空白边界(您可以考虑(?!\w)在此处再次使用)。

推荐阅读