在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python/ python中將一個(gè)字符串過(guò)濾并保留關(guān)鍵詞

python中將一個(gè)字符串過(guò)濾并保留關(guān)鍵詞

給出一個(gè)關(guān)鍵詞列表:

keys = ['aaa','bbb','ccc']

給出一個(gè)字符串 str,如果字符串中有包含列表 keys 中的子串,則過(guò)濾并保留下來(lái),其余部分則刪除。請(qǐng)問(wèn)可以如何實(shí)現(xiàn)?

例子:

str = 'aaaawtf he   heheccc'

過(guò)濾后變成:

'aaa ccc'

例子二:

str = 'aaabbb/&edfg cccaaa'

過(guò)濾后變成:

'aaabbb cccaaa'

也就是:要求盡可能保留原字符串的相對(duì)位置信息,比如aaa和bbb是連在一塊的,就連在一塊被保留下來(lái)

回答
編輯回答
陌離殤

比較好理解的做法如下。

str = 'aaabbb/&edfg cccaaa'
keys = ['aaa', 'bbb', 'ccc']

found = {k: [] for k in keys}
total_length = len(str)

# 按key依次遍歷字符串,保存出現(xiàn)的位置
for key in keys:
    length, i = len(key), 0

    while i + length <= total_length:
        s = str[i:i + length]

        if s == key:
            found[key].append(i)
            i += length
        else:
            i += 1

print(found) 
# {'aaa': [0, 16], 'bbb': [3], 'ccc': [13]}

result, next_match_index = '', -1

# 重新組合,如果坐標(biāo)重疊連接符為空,否則為空格
for i in range(total_length):
    for k, v in found.items():
        if i in v:
            split = '' if next_match_index == i else ' '

            result = result + split + k
            next_match_index = i + len(k)

print(result)
# aaabbb cccaaa

優(yōu)化循環(huán)次數(shù)后結(jié)果一樣,但沒(méi)那么好懂。

str = 'aaaabbb/&edfg cccaaa'
keys = ['aaa', 'bbb', 'ccc']

total_length = len(str)
result, next_match_index, skip = '', -1, 0

for i in range(total_length):

    if skip:
        skip -= 1
        continue

    for key in keys:  # 查找當(dāng)前位置是否有match的key
        length = len(key)

        if i + length <= total_length:  # 確保index不越界
            s = str[i:i + length]

            if s == key:  # 如果有match的key,添加到結(jié)果
                split = '' if next_match_index == i else ' '
                result = result + split + key

                next_match_index = i + length #預(yù)測(cè)相鄰key的位置
                skip = length - 1 #需要跳過(guò)當(dāng)前key再匹配下一個(gè)key
                break # 已經(jīng)找到匹配key,可以結(jié)束keys的遍歷

print(result)
2017年2月19日 09:27
編輯回答
怣痛
import re

def foo(keys, text):
    flags = [i for i in re.split('|'.join(keys), text) if i]
    if flags:
        text = re.sub('|'.join(flags), ' ', text)
    return text

測(cè)試結(jié)果如下:

k = ['aaa', 'bbb', 'ccc']
>>> print foo(k, 'aaaawtf he heheccc')
aaa ccc
>>> print foo(k, 'aaabbb/&edfg cccaaa')
aaabbb cccaaa
>>> print foo(k, 'ccchhaaauuccc')
ccc aaa ccc
>>> print foo(k, 'cccccc')
cccccc 
2017年12月22日 09:27
編輯回答
假灑脫
import re

keys = ['aaa', 'bbb', 'ccc', ' ']
str = 'aaa bbb /&edcccfg cccaaa'

for _ in re.split('|'.join(keys), str):
    if _:
        str = str.replace(_, '')

print str
2017年10月28日 08:44