【问题标题】:Python Regex: How to find a substringPython 正则表达式:如何查找子字符串
【发布时间】:2021-06-14 18:16:48
【问题描述】:

我有一个需要标准化的标题列表。例如,如果标题包含“CTO”,则需要将其更改为“首席技术官”。但是,如果“CTO”的左侧或右侧没有直接字母,我只想替换“CTO”。例如,“Director”包含“cto”。我显然不希望这个被替换。但是,我确实希望在标题为“创始人/CTO”或“CTO/创始人”的情况下替换它。

有没有办法使用正则表达式检查 字母 是否在 'CXO' 之前?或者完成这项任务的最佳方法是什么?

编辑: 我的代码如下...

test = 'Co-Founder/CTO'
test = re.sub("[^a-zA-Z0-9]CTO", 'Chief Technology Officer', test)

结果是“联合创始人首席技术官”。 '/' 因某种原因被替换。但是,如果 test = 'CTO/Co-Founder',则不会发生这种情况。

【问题讨论】:

标签: python regex string regex-group


【解决方案1】:

你想要的是一个排除点之前的东西列表的正则表达式:

"[^a-zA-Z0-9]CTO"

但实际上你还需要检查 CTO 何时出现在行首:

"^CTO"

要使用re.sub中的第一个表达式,您可以添加一个分组运算符(()s),然后在替换中使用它来提取匹配的字符(例如,空格或/):

re.sub("([^a-zA-Z0-9])CTO","\\1Chief Technology Officer", "foo/CTO")

会导致

'foo/Chief Technology Officer'

【讨论】:

  • 我将如何使用 re.sub() 来实现它?在“创始人/首席技术官”的情况下,“/”被替换,因此最终结果是“创始人首席技术官”。或者除了re.sub()还有什么更好的方法吗?
  • 谢谢,非常感谢。只是为了澄清一下,替换中的“\\1”引用了“([^a-zA-Z0-9])”分组?
  • 没错。您可以在 ()s 中分组,然后提取它以后匹配的任何内容。
【解决方案2】:

回答"(?<=[^a-zA-Z0-9])CTO|^CTO"

Lookbehinds 非常适合这个

cto_re = re.compile("(?<=[^a-zA-Z0-9])CTO")

但不幸的是不适用于行首(仅由于 python 实现需要固定长度)。

for eg in "Co-Founder/CTO", "CTO/Bossy", "aCTOrMan":
    print(cto_re.sub("Chief Technology Officer", eg))

Co-Founder/Chief Technology Officer
CTO/Bossy
aCTOrMan

您必须通过| 明确检查:

cto_re = re.compile("(?<=[^a-zA-Z0-9])CTO|^CTO")
for eg in "Co-Founder/CTO", "CTO/Bossy", "aCTOrMan":
    print(cto_re.sub("Chief Technology Officer", eg))

Co-Founder/Chief Technology Officer
Chief Technology Officer/Bossy
aCTOrMan

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多