如何根据索引替换子字符串?

时间:2016-05-03 07:12:05

标签: python regex string awk sed

我有一个字符串(一个日志行,实际上,包含敏感信息(info)),我想根据字符串中子字符串的索引替换其中的子字符串。子字符串中可以包含多个单词,但根据要求,它必须被视为单个子字符串。

详细信息:

所以,这是我的字符串:

[2016-04-25 03:48:34] 123737 error 150531221446 2000 Master dmart 843212 "Tough times"

在这里,我们需要用一些字符串替换“#34; Tough times"”这个词,比如说"人类"。现在,以下是必须处理字符串的方式:

  

[2016-04-25 03:48:34] - > index 0

     

123737 - >指数1

     

错误 - >索引2(......等等)

     

"艰难时期" - >指数8

现在,python程序(我正在研究),没有任何关于子字符串的线索,即"艰难时期",它只会提供数字' 9' (单词的索引,如上所示),程序将用结果字符串替换第9个索引中的任何子字符串。类似地,如果程序提供了数字' 7',它将用结果字符串替换第7个索引中的任何子字符串。

现在,我尝试过使用正则表达式,sed,awk等,但无法找到合适的答案。我找到的最近的解决方案是regex

但它不符合我的要求。

现在,我怀疑我的要求是否荒谬。

4 个答案:

答案 0 :(得分:5)

回答修订问题

让我们从字符串开始:

>>> orig = '[2016-04-25 03:48:34] 123737 error 150531221446 2000 Master dmart 843212 "Tough times"'

接下来,让我们将字符串分成子串:

>>> import re
>>> s = re.findall(r'(\[[^]]*\]|\w+|"[^"]*")', orig)
>>> s
['[2016-04-25 03:48:34]', '123737', 'error', '150531221446', '2000', 'Master', 'dmart', '843212', '"Tough times"']

现在,让我们更改第九个子字符串并重新组合字符串:

>>> s[8] = '"Human race"'
>>> ' '.join(s)
'[2016-04-25 03:48:34] 123737 error 150531221446 2000 Master dmart 843212 "Human race"'

有关正则表达式的更多信息

正则表达式允许子字符串匹配以下三种模式中的任何一种:

  1. \[[^]]*\]:以[开头并以]结尾的子字符串,除]外,其中包含任意字符。

  2. \w+:任何一系列“单词”字符。

  3. "[^"]*":双引号字符串。

  4. 回答原始问题

    此方法在字符串中查找匹配的分隔符。分隔符可以是(a)[],或(b)(),或(c)"" 。分隔符可以按任何顺序排列。找到匹配的分隔符后,字符串将被分为子字符串,然后我们可以更改和重新组合。

    为了演示,让我们从这个字符串开始:

    >>> orig = '[2016-04-25 03:48:34] (info) (info) (info) (info) (info) (info) (info) "Tough times"'
    

    接下来,让我们将其拆分为具有匹配分隔符的组:

    >>> import re
    >>> s = re.findall(r'(\[[^]]*\]|\([^)]*\)|"[^"]*")', orig)
    >>> s
    ['[2016-04-25 03:48:34]', '(info)', '(info)', '(info)', '(info)', '(info)', '(info)', '(info)', '"Tough times"']
    

    现在,让我们改变第九个字符串并重新组合:

    >>> s[8]='"Human Race"'
    >>> ' '.join(s)
    '[2016-04-25 03:48:34] (info) (info) (info) (info) (info) (info) (info) "Human Race"'
    

答案 1 :(得分:0)

看起来你有一个清单

只需通过索引来解决列表:

l=["2016-04-25 03:48:34", "info", "info", "info", "info", "info", "info", "info", "Tough times"]

l[8]
'Tough times'

列表从0开始编号,因此第一个元素是l[0],第九个元素是l[8]

答案 2 :(得分:0)

这是正则表达式,您可以使用它来查找由圆括号,方括号,单引号或双引号分隔的所有子字符串:

(?:([\"\'])|(\()|(\[)).+?(?(1)\1|(?(2)\)|\]))

Check this regex out at regex101.com

这是一个用法示例:

import re
regex = re.compile(r'(?:([\"\'])|(\()|(\[)).+?(?(1)\1|(?(2)\)|\]))')

line = '[2016-04-25 03:48:34] (info) (info) (info) (info) (info) (info) (info) "Tough times"'
index = 9  # 1-based index
replacement = '"Human race"'  # note the double quotes that will appear in the result

substrings = [match.group(0) for match in regex.finditer(s)]
item_to_replace = substrings[index-1]

result = line.replace(item_to_replace, replacement)
print(result)

输出:

[2016-04-25 03:48:34] (info) (info) (info) (info) (info) (info) (info) "Human race"

答案 3 :(得分:0)

你可以使用简单的字符串拆分操作:

string= '[2016-04-25 03:48:34] (info) (info) (info) (info) (info) (info) (info) "Tough times"'
a=(string.split('] ')[0]+']')
words=((string.split('] ')[1]).split(' ',7))
words.insert(0,a)

现在您可以按索引值访问这些单词。连接你可以使用:

words[8]='changed string'
new_string=' '.join(words)

,输出结果为:

'[2016-04-25 03:48:34] (info) (info) (info) (info) (info) (info) (info) changed string'