Объединение регулярных выражений в Python - \ W и \ S - PullRequest
3 голосов
/ 19 мая 2019

Я хочу, чтобы мой код возвращал только специальные символы [".", "*", "=", ","] Я хочу удалить все цифры / буквы ("\W") и все пробелы ("\S")

import re

original_string = "John is happy. He owns 3*4=12, apples"
new_string = re.findall("\W\S",original_string)
print(new_string)

Но вместо этого я получаю это как вывод: [' i', ' h', ' H', ' o', ' 3', '*4', '=1', ' a']

Я понятия не имею, почему это происходит. Отсюда у меня два вопроса:

1) Можно ли достичь моей цели с помощью регулярных выражений

2) Что на самом деле происходит с моим кодом?

Ответы [ 3 ]

3 голосов
/ 19 мая 2019

Вы были близки, но вам нужно указать эти escape-последовательности внутри класса символов.

re.findall(r'[^\w\s]', original_string)
# ['.', '*', '=', ',']

Обратите внимание, что символ ^ обозначает отрицание (то есть не не соответствует этим символам).

В качестве альтернативы, вместо удаления того, что вам не нужно, почему бы не извлечь то, что вы делаете?

re.findall(r'[.*=,]', original_string)
# ['.', '*', '=', ',']
2 голосов
/ 19 мая 2019

Здесь мы также можем добавить желаемые специальные символы в [], провести пальцем по всему остальному, а затем собрать только эти символы:

([\s\S].*?)([.*=,])?

Python Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"([\s\S].*?)([.*=,])?"

test_str = "John is happy. He owns 3*4=12, apples"

subst = "\\2"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

JavaScript Demo

const regex = /([\s\S].*?)([.*=,])?/gm;
const str = `John is happy. He owns 3*4=12, apples`;
const subst = `$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

RegEx

Если это не наше желаемое выражение, мы можем изменить / изменить его в regex101.com .

enter image description here

RegEx Circuit

Мы также можем визуализировать выражения в jex.im :

enter image description here

Демо

1 голос
/ 19 мая 2019

Регулярное выражение \W\S соответствует последовательности из двух символов;одно не слово и одно не пробел.Если вы хотите объединить их, это [^\w\s], что соответствует одному символу, который не принадлежит ни слову, ни группе пробелов.

Однако, есть много символов, которые не являются перечисленными вами, которыесопоставьте это выражение.Если вы хотите удалить символы, которых нет в вашем наборе, класс символов, содержащий ровно все эти символы, просто [^.*=,]

Возможно, стоит отметить, что внутри [...] вам не нужно (и вфакт не должен) обратная косая черта, например, буквальная точка.По умолчанию класс символов не может соответствовать символу новой строки, хотя есть опция re.DOTALL, чтобы изменить это.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...