我有一个字符串(一个日志行,实际上,包含敏感信息(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。
但它不符合我的要求。
现在,我怀疑我的要求是否荒谬。
答案 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"'
正则表达式允许子字符串匹配以下三种模式中的任何一种:
\[[^]]*\]
:以[
开头并以]
结尾的子字符串,除]
外,其中包含任意字符。
\w+
:任何一系列“单词”字符。
"[^"]*"
:双引号字符串。
此方法在字符串中查找匹配的分隔符。分隔符可以是(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'