繁体   English   中英

查找和替换字符串中的单词

[英]Find and replace words in string

我知道这个问题在不同的版本中已经问过很多遍了,但是我没有找到任何对我有帮助的东西。

我有一个词表:

arr = ["id",...]

我有几个字符串:

str = "my_id"
str1 = "Id_number"
str2 = "my_id_rocks"
str3 = "my_idea"

我试图在字符串中找到单词“ id”,然后大写。 但是如果id是字符串中单词的一部分,则什么也不做。 我应用功能Ill get后的含义:

str = "my_ID"
str1 = "ID_number"
str2 = "my_ID_rocks"
str3 = "my_idea"

我不能假设任何有关字符串的信息,有些字母可以是大写字母,有些可以是小写字母。

到目前为止,这就是我所拥有的,但这也可以idea => IDea实现我不想要的idea => IDea

def words_to_upper(str):
    words = ["id"]
    for word in words:
        if word in str.lower():
            replace_word = re.compile(re.escape(word), re.IGNORECASE)
            str = replace_word.sub(word.upper(), str)
            break
    return str

谢谢。

您可以使用lookarounds检查有没有alnum前后id

(?i)(?<![a-z0-9])id(?![a-z0-9])

在regex101上查看演示

我添加了[regexp]标记,因为您需要它们执行此操作(或者最后,这就是它们的用途,因此,最好使用它们而不是重新发明轮子)。

您需要的关键字是先行和后行,请参阅本节底部

import re

teststrs = ["my_id", "Id_number", "my_id_rocks", "my_idea"]

replace_with_upper = "id"

def toUpper(match):
    return match.group(1).upper()

for test_me in teststrs:
    test_me = re.sub("(?<![a-z])({})(?![a-z])".format(replace_with_upper), toUpper, test_me, flags=re.IGNORECASE)
    print(test_me)

(?<![az])在后面是负数:“如果此模式在左侧匹配,则不匹配”。 因此,如果"id"的左侧有一个字母,则不匹配。 您的示例并不会发生这种情况,但我认为您也希望这种行为。

(?![az])是一个否定的前瞻:“如果此模式在右侧匹配,则不匹配”。 这可以防止正则表达式匹配"my_idea" ,因为前瞻可以看到"e"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM