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

时间:2015-11-15 09:22:22

标签: python regex string python-2.7

我知道这个问题在不同的版本中被多次询问过,但我没有找到任何帮助我的东西。

我有一个单词列表:

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"

我不能假设字符串,有些字母可以是大写字母,有些是小写字母。

到目前为止,这就是我所拥有的,但这也使我{I}不想要的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

谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

See demo at regex101

答案 1 :(得分:1)

我添加了[regexp]标签,因为你需要他们这样做(或者最后,它是他们的目的,所以你最好使用它们而不是重新发明轮子)。

您需要的关键字是前瞻性和后瞻性,请参阅this section

的底部
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)

(?<![a-z])是一个负面的后视:&#34;如果此模式在左侧匹配,则不匹配&#34;。因此,如果"id"左侧有一封信,请不要匹配。您的示例不会发生这种情况,但我认为您也希望这种行为。

(?![a-z])是一个负向前瞻:&#34;如果此模式在右侧匹配,则不匹配&#34;。这可以防止正则表达式与"my_idea"匹配,因为前瞻会看到"e"