2015-08-10 6 views
0

Я хочу оценить значение true, если строка содержит слово «except» AND, за которым следует «xyz». Например,Соответствующая строка содержит x и затем y

blah except xyz => true 
except xyz => true 
blah except abc => false 
blah except abc, xyz => true 
blah except xyz, abc => true 
xyz except abc => false 

Каков самый питонический способ сделать это? Регулярные выражения кажутся более убитыми. Это, вероятно, будет использоваться только в одной функции. Я использовал оператор in, чтобы найти часть строки except, но я не уверен, как действовать дальше. Это не должно быть чувствительным к регистру.

ответ

4

Попробуйте это регулярное выражение:

"except(?=[^\n]*?xyz)"

  • Это займет текст except только
  • если до конца линии в [^\n]*?
  • не возможно найти xyz.

Regex live here.


Как использовать его в питон?

import re 
word = 'blah except xyz => true' 
regexp = re.compile(r'except(?=[^\n]*?xyz)') 
if regexp.search(word) is not None: 
    print 'matched' 

Надеется, что это помогает.

+0

Как вы положили его в Python, хотя? Я попробовал 'if re.match (r'except? =. *? Xyz ', row [0]):' и он не соответствует. – Celeritas

+1

@Celeritas. Я обновил пример –

+1

'match()' только успешно, если шаблон найден в _beginning_ строки. 'search()' преуспевает, если шаблон найден _anywhere_ в строке. – TigerhawkT3

3

Как насчет операций со строками?

if 'except' in my_string.lower() and my_string.lower().find('xyz') > my_string.lower().find('except'): 
    return True 

Вы также можете использовать ЭСПЦ и не смотреть на 'except' дважды:

try: 
    if my_string.lower().index('xyz') > my_string.lower().index('except'): 
     return True 
    else: 
     return False 
except ValueError: 
    return False 

Это проще, если вам нужно только truthy/значения falsey, а не фактические булевы:

try: 
    if my_string.lower().index('xyz') > my_string.lower().index('except'): 
     return True 
except ValueError: 
    return 
+0

«правдивые/ложные значения, а не фактические логические значения». В чем разница? – Celeritas

+0

Некоторые вещи, такие как пустые итерации ('set',' list', 'str' и т. Д.),' None' и '0', при использовании в качестве предиката, оцениваются как' False'. Однако они фактически не равны логическому значению.Таким образом, если отказ возвращает 'None' вместо' False', 'if check (my_string):' будет работать нормально, но 'sum (check (my_string) для my_string в строках)' would not. – TigerhawkT3

0

Это один из тех случаев, когда регулярное выражение имеет смысл:

if re.search('except.*xyz', string): 
    ... 

Простой, быстрый и элегантный.

0

Я думаю, что это наиболее читаемым:

'except' in my_string and 'xyz' in my_string.split('except', 1)[1] 
Смежные вопросы