2013-07-23 4 views
1

Я ударил стену и нуждаюсь в некоторой помощи.Поиск индекса элемента через REGEX в Python

Контекст: У меня есть список списков строк.

Matrix = [['444'], 
      ['23%'], 
      ['A']] 

На данный момент, у нас есть список графов в положении 0, в процентах на 1 и Значение теста на 2.

Число списков в списке изменяется от 3 до 2: 1, время от ко времени. И тип строки в списке меняет позицию. Поэтому я не могу предположить, что индекс 0 всегда будет Counts и процент будет равен 1 и т.д.

Следовательно, я хотел найти способ динамического определения, где процент, например, находится в матрице, и если его даже в там.

Вот что я написал до сих пор:

for i, row in enumerate(Matrix): 
    for cell in row: 
     if "%" in cell: 
      percent = i 
      print percent 
for i, row in enumerate(Matrix): 
    for cell in row:    
     if re.search('[a-zA-Z]', cell): 
      sigtest = i 
      print sigtest 
for i, row in enumerate(Matrix): 
    for cell in row: 
     if re.search('[0-9]', cell): 
      count = i 
      print count 

Выход:

1 
2 
0 
1 

Проблема: Как вы можете видеть, что проблема находится с последним для цикла, который фиксирует факт что индекс 0 и 1 содержат числа.

Что нужно: путь для последнего цикла для поиска только чисел и цифр, элемент содержит числа и символ, этот индекс не должен включаться.

Надеюсь, что имеет смысл!

благодаря

ответ

1

Чтобы проверить, содержит ли строка только цифры вы можете использовать:

>>> bool(re.search(r'^[0-9]+$', '4444')) 
True 
>>> '4444'.isdigit() #Doesn't work for floats 
True 
# This will work for floats as well 
>>> bool(re.search(r'^[0-9]*(\.[0-9]+)?$', '4444.123')) 
True 
>>> bool(re.search(r'^[0-9]*(\.[0-9]+)?$', '.123')) 
True 

Для процентах вы можете использовать этот regex

>>> bool(re.search(r'^[0-9]+%$', '23%')) 
True 
#To handle floats as well use this: 
>>> bool(re.search(r'^[0-9]*(\.[0-9]+)?%$', '23.15%')) 
True 
>>> bool(re.search(r'^[0-9]*(\.[0-9]+)?%$', '.150%')) 
True 

Для sigtest:

>>> bool(re.search(r'^[a-z]$', 'a',re.I)) 
True 
>>> bool(re.search(r'^[a-z]$', 'B',re.I)) 
True 

Здесь ^ и $ являются meta-characters:

^ соответствует началу строки и $ соответствует концу строки.

+0

Вы используете только неподписанное число. Вы можете начать с '(- | +)?'. – elnabo

+0

@ Ashwini, спасибо за это. Я тестировал его, и проблема остается. Если я хочу найти индекс процентной строки в списке (Матрица), ваш код даст мне индекс 0 и 1 вместо 1. Я предполагаю, потому что индекс 0 также содержит числа. В идеале я хочу запустить одну функцию, чтобы получить индекс количества, процента и значения. –

+0

@ Boosted_d16 Нет, этого не будет, для '444' мое регулярное выражение вернет 'False'. 'bool (re.search (r '^ [0-9] +% $', '444'))' -> 'False'. Вы делаете что-то неправильно. –

Смежные вопросы