Разделить строки на слова с несколькими разделителями слов - PullRequest
596 голосов
/ 29 июня 2009

Я думаю, что то, что я хочу сделать, является довольно распространенной задачей, но я не нашел ссылки в Интернете. У меня есть текст с пунктуацией, и я хочу список слов.

"Hey, you - what are you doing here!?"

должно быть

['hey', 'you', 'what', 'are', 'you', 'doing', 'here']

Но Python str.split() работает только с одним аргументом, поэтому у меня есть все слова с пунктуацией после разделения на пробел. Есть идеи?

Ответы [ 32 ]

1 голос
/ 04 июня 2016

Вот ответ с некоторым объяснением.

st = "Hey, you - what are you doing here!?"

# replace all the non alpha-numeric with space and then join.
new_string = ''.join([x.replace(x, ' ') if not x.isalnum() else x for x in st])
# output of new_string
'Hey  you  what are you doing here  '

# str.split() will remove all the empty string if separator is not provided
new_list = new_string.split()

# output of new_list
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

# we can join it to get a complete string without any non alpha-numeric character
' '.join(new_list)
# output
'Hey you what are you doing'

или в одну строку мы можем сделать так:

(''.join([x.replace(x, ' ') if not x.isalnum() else x for x in st])).split()

# output
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

обновленный ответ

0 голосов
/ 17 мая 2019

Мне недавно нужно было сделать это, но я хотел функцию, которая несколько соответствовала функции стандартной библиотеки str.split, эта функция ведет себя так же, как стандартная библиотека, когда вызывается с 0 или 1 аргументом.

def split_many(string, *separators):
    if len(separators) == 0:
        return string.split()
    if len(separators) > 1:
        table = {
            ord(separator): ord(separator[0])
            for separator in separators
        }
        string = string.translate(table)
    return string.split(separators[0])

ПРИМЕЧАНИЕ : эта функция полезна только в том случае, если разделители состоят из одного символа (как в моем случае использования).

0 голосов
/ 06 августа 2011

Вот мой подход к разделению с несколькими разделителями:

def msplit( str, delims ):
  w = ''
  for z in str:
    if z not in delims:
        w += z
    else:
        if len(w) > 0 :
            yield w
        w = ''
  if len(w) > 0 :
    yield w
0 голосов
/ 29 апреля 2013

Вот мой взгляд ...

def split_string(source,splitlist):
    splits = frozenset(splitlist)
    l = []
    s1 = ""
    for c in source:
        if c in splits:
            if s1:
                l.append(s1)
                s1 = ""
        else:
            print s1
            s1 = s1 + c
    if s1:
        l.append(s1)
    return l

>>>out = split_string("First Name,Last Name,Street Address,City,State,Zip Code",",")
>>>print out
>>>['First Name', 'Last Name', 'Street Address', 'City', 'State', 'Zip Code']
0 голосов
/ 29 июня 2009

Вы хотите метод findall() модуля Python RegEx:

http://www.regular -expressions.info / python.html

Пример

0 голосов
/ 22 января 2018

Если вам нужна обратимая операция (сохранить разделители), вы можете использовать эту функцию:

def tokenizeSentence_Reversible(sentence):
    setOfDelimiters = ['.', ' ', ',', '*', ';', '!']
    listOfTokens = [sentence]

    for delimiter in setOfDelimiters:
        newListOfTokens = []
        for ind, token in enumerate(listOfTokens):
            ll = [([delimiter, w] if ind > 0 else [w]) for ind, w in enumerate(token.split(delimiter))]
            listOfTokens = [item for sublist in ll for item in sublist] # flattens.
            listOfTokens = filter(None, listOfTokens) # Removes empty tokens: ''
            newListOfTokens.extend(listOfTokens)

        listOfTokens = newListOfTokens

    return listOfTokens
0 голосов
/ 24 декабря 2013
def get_words(s):
    l = []
    w = ''
    for c in s.lower():
        if c in '-!?,. ':
            if w != '': 
                l.append(w)
            w = ''
        else:
            w = w + c
    if w != '': 
        l.append(w)
    return l

Вот использование:

>>> s = "Hey, you - what are you doing here!?"
>>> print get_words(s)
['hey', 'you', 'what', 'are', 'you', 'doing', 'here']
0 голосов
/ 23 мая 2019

Мне нравится решение pprzemek, потому что оно не предполагает, что разделители являются отдельными символами, и не пытается использовать регулярное выражение (что не будет работать хорошо, если число разделителей должно быть слишком большим).

Вот более читаемая версия вышеуказанного решения для ясности:

def split_string_on_multiple_separators(input_string, separators):
    buffer = [input_string]
    for sep in separators:
        strings = buffer
        buffer = []  # reset the buffer
        for s in strings:
            buffer = buffer + s.split(sep)

    return buffer
0 голосов
/ 15 марта 2011

есть та же проблема, что и у @ooboo, и найти эту тему @ ghostdog74 вдохновил меня, возможно, кто-то найдет мое решение полезным

str1='adj:sg:nom:m1.m2.m3:pos'
splitat=':.'
''.join([ s if s not in splitat else ' ' for s in str1]).split()

введите что-нибудь в пробел и разделите, используя тот же символ, если вы не хотите разбивать на пробел.

0 голосов
/ 08 февраля 2014

Мне больше нравится replace(). Следующая процедура заменяет все разделители, определенные в строке splitlist, на первый разделитель в splitlist, а затем разбивает текст на этом одном разделителе. Также учитывается, является ли splitlist пустой строкой. Возвращает список слов без пустых строк.

def split_string(text, splitlist):
    for sep in splitlist:
        text = text.replace(sep, splitlist[0])
    return filter(None, text.split(splitlist[0])) if splitlist else [text]
...