【问题标题】:Find and replace words in string查找和替换字符串中的单词
【发布时间】:2015-11-15 09:22:22
【问题描述】:

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

我有一个单词列表:

arr = ["id",...]

我有几个字符串:

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

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

str = "my_ID"
str1 = "ID_number"
str2 = "my_ID_rocks"
str3 = "my_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

谢谢。

【问题讨论】:

  • @Delgan,为什么要删除它?我需要把这个词大写。
  • @Delgan,对不起我的错误,我当然需要将整个单词大写。我试图在字符串中找到单词“id”并转为大写。但如果“id”是单词的一部分,则什么也不做。
  • 好吧抱歉,我误解了你的问题。

标签: python regex string python-2.7


【解决方案1】:

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

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

See demo at regex101

【讨论】:

    【解决方案2】:

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

    你需要的关键字是lookahead和lookbehind,见底部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)
    

    (?&lt;![a-z]) 是一个否定的向后看:“如果此模式在左侧匹配,则不匹配”。所以如果"id"左边有一个字母,不要匹配。您的示例不会发生这种情况,但我认为您也想要这种行为。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 2020-06-03
      • 2019-12-30
      • 2011-11-13
      • 2015-07-03
      相关资源
      最近更新 更多