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

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

在这里,我们需要用一些字符串来代替“艰难时期”,比如“人类”。下面是处理字符串的方式:
[2016-04-25 03:48:34]>索引0
123737->索引1
错误->索引2(。。。等等)
“困难时期”->指数8
现在,python程序(我正在开发)对子字符串没有任何线索,即“困难时期”,它只提供数字'9'(单词索引,如上所示),程序将用结果字符串替换第9个索引中的任何子字符串。类似地,如果程序提供了数字“7”,它将用结果字符串替换第7个索引中的任何子字符串。
现在,我试过使用regex、sed、awk等,但找不到合适的答案。我找到的最接近的解决方案是这个regex
但不符合我的要求。
现在,我怀疑我的要求是否荒谬。

最佳答案

修改问题的答案
让我们从字符串开始:

>>> 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"'

更多关于regex的信息
正则表达式允许子字符串匹配以下三种模式之一:
\[[^]]*\]:以[开头,以]结尾的子字符串,除]外,它之间有任何字符。
\w+:任何一系列“word”字符。
"[^"]*":双引号字符串。
原题答案
此方法在字符串中查找匹配的分隔符。分隔符可以是(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"'

09-11 18:30
查看更多