2012-02-23 2 views
0

У меня есть пример здесь:Регулярного выражения для решения специальных символов

>>> txt1 
'fdf\\.\\..dgg' 

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

Так что я попробовал это.

>>> ans=re.search("\w+[\|.]*\w+",txt1) 
>>> ans.group() 
'fdf' 

\ w + найдет слова, продолжающиеся. [\ |.] Должен был найти \ или. (точка). Предполагалось, что звезда продолжится для следующей записи. Опять же, \ w + должен был найти конечные слова.

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

ответ

1

Вы не можете использовать оператор чере | в классе символов. Внутри [ ] труба означает именно этот символ. Ваша обратная косая черта ускользает от нее (без необходимости), поэтому вы ищете трубы или точки. Что вы хотите

ans=re.search(r"\w+[\\.]*\w+", txt1) 
+0

email = "bogusemail123 @ sillymail.com " >>> x = re.search ('\ w + [. | \ w] @ (\ w + [.]) * (com $ | in $)', email) >>> x .group() '[email protected]' Это работает с OR ..... –

+1

Это потому, что у вас нет обратной косой черты в классе символов. '[.| \ w] 'будет соответствовать символу точки, трубы или слова, когда вы имеете в виду просто' [. \ w] '. В вашем исходном посте у вас был '[\ |.]', И обратная косая черта действовала, чтобы вырваться из трубы, так что это то же самое, что и '[|.]'. – Borodin

+0

Ох ....... Я полностью не понял ... Вы правы ... Спасибо, что привлекли к себе серьезную ошибку .... Большое спасибо ... –

1

«Я намереваюсь найти регулярное выражение, которое вернет мне специальные символы».

re.search(r"\w+([\\\.]*)\w+", txt1) 

находит с ans.group(1) то, что вам нужно:

ans = re.search(r"\w+([\\\.]*)\w+", txt1) 
ans.group(1) 

# '\\.\\..' 

[] проектирует группу символов (без | «или»), но вы должны обратный слеш и точка с обратной косой черты \. -> \\\. чтобы соответствовать этому.

+0

Я был под впечатлением, что символы, указанные на площади [] не должны быть сбежавшего с люфтом ... Спасибо за исправление –

+1

не ошибка как таковой, но точка внутри класса символов не нуждается в экранировании. – Borodin

+0

Только обратная косая черта нуждается в экранировании, и только тогда, потому что '[\.]' Будет рассматриваться как ненужная экранированная точка. Каретка '^' нуждается в экранировании только в том случае, если она является первым символом класса символов, где в противном случае это будет рассматриваться как отрицание всего класса. – Borodin

1

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

[^\w]+ 
+0

Это классный трюк ..... Thumbs up для этого –

0

Так как вы хотите, чтобы найти специальные символы, re.findall(r"[a-z]*([.\\] ?)[a-z]*", txt1) возвратит ваши символы в виде списка. Вы всегда можете join() их по мере необходимости (например, как показано ниже):

>>> 
>>> txt1 
'fdf\\.\\..dgg' 
>>> ans = re.findall(r"[a-z]*([.\\] ?)[a-z]*", txt1) 
>>> ans 
['\\', '.', '\\', '.', '.'] 
>>> 
>>> "".join(ans) 
'\\.\\..' 
>>> 
Смежные вопросы