Python正则表达式:如何查找子字符串

2022-05-21 08:08:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

编辑: 我的代码如下

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

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


Tags: test标题列表字母方式情况规范化技术首席director创始人办法ctocxo
2条回答
网友
1楼 ·

您需要的是一个正则表达式,它在一个点之前排除一系列内容:

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

但实际上,您还需要检查CTO何时出现在行的开头:

"^CTO"

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

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

将导致

'foo/Chief Technology Officer'
网友
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