2016-10-21 2 views
0

Я работаю над функцией, которая сохраняет символы, находящиеся внутри слова (слово может состоять из a-zA-Z, 0-9 и _), но удаляет все остальные символы вне слова:Альтернативный подход к символам полосы в строке

For example: 
Input String - hell_o ? my name _ i's <hel'lo/> 
Output - ['hell_o' ,'my', 'name', '_', "i's" ,'hel'lo'] 

функция я использую:

l = ' '.join(filter(None,(word.strip(punctuation.replace("_","")) for word in input_String.split()))) 
l = re.sub(r'\s+'," ",l) 
t = str.split(l.lower()) 

Я знаю, что это не самый лучший, оптимальный путь !! кто-нибудь рекомендовать ли какие-либо альтернативные варианты, которые я могу попробовать ?? Наверное Regex сделать это??

  • Я попытался с помощью: негативный взгляд вокруг и выглядеть задом: \W+(?!\S*[a-z])|(?<!\S)\W+

  • s.strip(punctuation)

  • re.sub('[^\w]', ' ', doc.strip(' ').lower()) - Это удаляет знаки препинания внутри слова слишком

+2

Если вы * * знаете, что это не '' 'лучший, optimal''' путь, то вы должны иметь некоторые альтернативы в виду - перечислите те (в вопросе) и причины, по которым вы их отвергаете, чтобы мы знали, на что не работать. – wwii

ответ

1

Вы можете соответствовать любой символ, отличный от a-zA-Z, 0-9 and _, как вы укажите между двумя буквами с (?<=[a-z])\W(?=[a-z]) и замените его ничем, чтобы удалить его.

В конце концов, у вас будет очень опасный алгоритм, например, в предложении I'm fine.And you?, если после точки нет пробела, оно будет в I'm fineAnd you?, что может быть не таким, каким вы хотите.


[EDIT] после ваших комментариев.

Хорошо, я неправильно понял ваш вопрос.

Теперь я пришел вместе с одним регулярным выражением вы хотите выбрать 'hell_o' ,'my', 'name', "i's" ,'hel'lo':

(?<![a-z])[a-z][^\s]*[a-z](?![a-z]).

Вы можете посмотреть его здесь: https://regex101.com/r/EAEelq/3. (не забудьте указать i и g).


[EDIT] Как вы хотите, чтобы соответствовать _ вне слова

ОК, так что если вы хотите подчёркивание быть согласованы также обновят как: (?<![a-z_])[a-z_][^\s]*[a-z_](?![a-z_])|(?<=)[a-z_](?=).

Посмотри здесь работает: https://regex101.com/r/EAEelq/4

+0

Да, спасибо за предложение !! Но это регулярное выражение не решает цель! Я попробовал это с несколькими примерами! Но не работает так, как ожидалось. Например: входная строка: 'Привет! не так ли? Это не весело !, и ожидаемый результат: «[« hi »,« there »,« do not »,« d ??? o »,« this »,« _ »,« it », не ',' fun '] '. Я все еще пытаюсь найти альтернативу! Удивление, если regEx определенно является лучшей альтернативой! –

+0

Я имел в виду, если regEx является «единственным» лучшим подходом, чем то, что я уже сделал! –

+1

Я отредактировал свой ответ после ваших комментариев, пожалуйста, проверьте, действительно ли это то, что вы хотите! – antoni

Смежные вопросы