2014-10-27 6 views
0

Как создать регулярное выражение, которое соответствует всем буквенно-цифровым символам без номера в начале?Regex не начинается с номера

Сейчас у меня есть "^[0-9][a-zA-Z0-9_]"

Например, 1ab не будет соответствовать, AB1 будет соответствовать, 1_bc не будет соответствовать, bc_1 будет соответствовать.

+0

ли вы имеете в виду, начиная с начала строки? –

ответ

2

Есть три вещи неправильно с тем, что вы написали.

Во-первых, чтобы отрицать класс персонажа, вы ставите внутри скобки, а не перед ними. ^[0-9] означает «любая цифра, в начале строки»; [^0-9] означает «ничего, кроме цифры».

Во-вторых, [^0-9] будет соответствовать что-нибудь Это не цифра, не только буквы и символы подчеркивания. Вы действительно хотите сказать, что первый символ «не цифра, а цифра, буква или знак подчеркивания», правильно? Хотя это не невозможно сказать, что гораздо проще просто объединить это в «буква или знак подчеркивания».

Кроме того, вы забыли повторить последний набор символов. Как есть, вы точно соответствуете двум символам, поэтому b1 будет работать, но b12 не будет.

Итак:

[a-zA-Z_][a-zA-Z0-9_]* 

Regular expression visualization

Debuggex Demo

В других словах: одна буква или знак подчеркивания, за которым следуют ноль или более букв, цифр или символов подчеркивания.

Я не совсем уверен, что это то, что вы на самом деле хотите, по крайней мере, если регулярное выражение является вашим парсером. Например, в foo-bar, хотите ли вы получить соответствие bar? Если да, то в 123spam вы хотите, чтобы spam соответствовал? Но это то, что вы пытались написать.

+0

$ abarnert Спасибо за этот ответ (и +1 за демоверсию Debuggex). Это именно то, что я сделал. – Apollo

0

Это следует сделать это:

^[^0-9][a-zA-Z0-9_]+$ 

Explaination:

  • ^: Матч beggining линии
  • [^0-9]: Спички один ничего, кроме цифры
  • [a-zA-Z0-9_]+: Соответствует одному или больше буквенно-цифрового символа
  • $: Соответствует концу линии
+0

Я уверен, что это не то, что он хочет. В конце концов, '-foo' не имеет числа в начале, поэтому оно будет соответствовать вашему выражению, но я не думаю, что это то, что он ищет. – abarnert

+0

@abarnert: Верно. Не понял этого. – Linuxios

+0

Ну, было бы лучше с более полным набором тестового ввода; Я _guessing_ он не хочет '-foo', основываясь на том, как он сформулировал свое описание, но было бы лучше узнать, что ... – abarnert

0

Вы можете использовать это: ^[A-Za-z_][A-Za-z0-9_]*$

0

Еще одно предложение, попробуйте следующее:

\b([a-zA-Z][^\s]*) 

Вы можете использовать этот код для перебора результатов:

reobj = re.compile(r"\b([a-zA-Z][^\s]*)") 
for match in reobj.finditer(subject): 
    start = match.start() 
    end = match.end() 
    text = match.group() 
0

Вы можете использовать это регулярное выражение:

^[a-z]\w+$ 

Working demo

enter image description here

Идея регулярных выражений является то, что

^[a-z] -> Have to start with a letter 
\w+$  -> can contain multiple alphanumeric characters (\w is the shortcut for [A-Za-z_]) 

иметь в виде регулярных выражений флагов i для нечувствительных и m для многострочного.

Питон код вы можете использовать это:

import re 
p = re.compile(ur'^[a-z]\w+$', re.MULTILINE | re.IGNORECASE) 
test_str = u"would match\nab1\nbc_1\n\nwould not match\n1_bc\n1ab" 

re.findall(p, test_str) 
Смежные вопросы