2015-09-17 4 views
1

Я пытаюсь перечислить часть данных, деленную на единую обратную косую черту. Часть представляет собой только шестизначное число. Причина, по которой мне нужно процитировать обратную косую черту, заключается в том, что я буду использовать этот код для большего количества файлов, которые могут включать в себя шесть других чисел (и более) цифр в группе данных.Как искать данные, деленные на обратную косую черту с использованием регулярных выражений в Python

Вот пример кода:

>>> layer = arcpy.mapping.Layer("J:\abcd\blabla.lyr") 
>>> print layer.dataSource 
C:\Users\416938\AppData\Roaming\ESRI\Desktop10.0\ArcCatalog\... 
>>> result = re.search (r'([a-z]{1}[0-9]{6})', text) 
>>> result.group(0) 
u'416938' 

Но я хотел бы, чтобы включить обратную косую черту, как это (очевидно, этот код не будет работать):

re.search (r'(\[0-9] {6}\)', text) 

Любая помощь очень оценили. Благодарю.

+2

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

+0

Думаете, вам нужно '\ b' –

+1

Является ли' {6} 'связанным с пробелом или классом чисел? – wenzul

ответ

1

Вот код, который можно использовать для извлечь номер 6-значный, что это целое слово:

import re 
p = re.compile(ur'\b[0-9]{6}\b') 
test_str = ur"C:\\Users\\416938\\AppData\\Roaming\\ESRI\\Desktop10.0\\ArcCatalog" 
match = re.search(p, test_str) 
if match: 
    print(match.group(0)) 

См IDEONE demo

Отметьте, что \b - a word boundary - соответствует по следующим позициям:

  • Перед первым символом в строке, если первый символ является символом слова.
  • После последнего символа в строке, если последний символ является символом слова.
  • Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

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

(?<=\\)[0-9]{6}(?=\\) 

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

(?<!\d)[0-9]{6}(?!\d) 

В нем есть 2 вида вокруг. (?<!\d) удостоверяется, что перед 6-значной последовательностью нет цифры, а (?!\d) гарантирует, что после нее цифр нет.

+1

Благодарим за объяснение :) – MetalMuzu

+0

Отлично! Сейчас работает upvoting! еще раз спасибо :) – MetalMuzu

2

Вам нужно бежать обратный слэш:

re.search (r'(\\[0-9] {6}\\)', text) 
+1

Спасибо, ваш ответ также полезен. – MetalMuzu

0

Если путь окна всегда будет иметь данную структуру C:\Users\[0-9]{6}\... - здесь мы идем без осложненного сбежавшего синтаксиса регулярных выражений:

>>> text = r"C:\Users\416938\AppData\Roaming\ESRI\Desktop10.0\ArcCatalog" 
>>> match = text.split("\\")[2] # split at \ and grad third element 
'416938' 
>>> if match.isdigit() and len(match) == 6: # check for digit and length 6 
...