2016-11-10 2 views
-2

У меня есть список строк, и нужно найти все, что следовать этой логикеКак извлечь из элементов списка 2digits "." 2digits только в Iron Python?

twodigits.twodigits 
Example| Correct? 
----------- | ------ 
03.38 | Yes 
10.59 | Yes 
10.23 m3/h | No 
50.8 mm | No 

Я пытался только искать «» но не сработало ...

for i in elements: 
    id = i.Id 
    if i.Text[2:3] == '.': 
     i.Text= '' 
     atext1.append(i.Text) 

Я нашел это, но не уверен, как его использовать в моем коде?

str_extract_all(text, "\\d{2}.\\d{2}") %>% 

Мой текущий код из ответов:

for i in elements: 
    id = i.Id 
    match = search('\d{2}\.\d{2}$',i.strip()) 
    if match: 
     atext1.append(match.string) 
     i.Text= '' 
     #atext1.append(i.Text) 
    else: 
     atext2.append(i.Text) 
    atext.append(i.Text) 

еще одну попытку, но до сих пор не работает

for i in elements: 
    id = i.Id 
    k = i.Text 
    atext3.append(k) 

    match=search('\d{2}\.\d{2}$',k.strip()) 
    if match: atext4.append(match.string) 
     i.Text= '' 

это один так же не увенчались успехом

for i in elements: 
    id = i.Id 
    k = i.Text 
    atext3.append(k) 
    if k.split('.')[0:2].isdigit(): 
     i.Text= '' 
     atext3.append(i.Text) 

Я получил эту работу в конце концов. Спасибо всем за помощь

import clr 
clr.AddReference('ProtoGeometry') 
from Autodesk.DesignScript.Geometry import * 
clr.AddReference("RevitNodes") 
import Revit 
clr.ImportExtensions(Revit.Elements) 
clr.AddReference("RevitServices") 
import RevitServices 
from RevitServices.Persistence import DocumentManager 
from RevitServices.Transactions import TransactionManager 
from System.Collections.Generic import * 
clr.AddReference("RevitAPI") 
import Autodesk 
from Autodesk.Revit.DB import * 
from re import search 

doc = DocumentManager.Instance.CurrentDBDocument 
uiapp = DocumentManager.Instance.CurrentUIApplication 
app = uiapp.Application 


#The inputs to this node will be stored as a list in the IN variable. 

#from re import search 

atext3 = [] 
atextTrue = [] 
atextFalse = [] 
atextAll = [] 

#unwrap all elements to use with API 
elements = [] 
for i in IN[0]: 
    elements.append(UnwrapElement(i)) 

TransactionManager.Instance.EnsureInTransaction(doc) 

for i in elements: 
    atext3 = i.Text 
    match = search('\d{2}\.\d{2}$', atext3.strip()) 
    if match: 
     i.Text = 'deletedTEXT'  
     atextTrue.append(i.Text) 
    else: 
     atextFalse.append(i.Text) 

    atextAll.append(i) 

TransactionManager.Instance.TransactionTaskDone() 

#Assign your output to the OUT variable 
OUT = atextTrue, atextFalse, atextAll 
+0

Да, конечно, список находится на вершине вот пример [03,38, 10,59, 10,23 м3/ч, 50,8 мм, коза, VCD, 48L/s, 10,203, 02,72, 03,55. ] – Michal

+0

в случае '10.23 m3/h' вы хотите извлечь' 10.23' или пропустить его полностью, потому что он не содержит только 'twodigits.twodigits'? – LMc

+0

Я хочу пропустить его ... так же мне нужно вставить это в мое, если мне нужно заменить этот текст для каждого элемента в списке, а если он соответствует, замените на None, поэтому i.Text = '' эта строка следует – Michal

ответ

0
def fits_pattern(s): 
    s = s.strip() 
    return len(s) == 5 and s[2] == '.' and (s[:2] + s[-2:]).isdigit() 


for test_string in ['03.38', '10.59 ', '10.23 m3/h', '50.8 mm', 
        'ab.cd', '12.3d', '1234', '12345', '', '  12.34  ']: 
    print(repr(test_string)) 
    print(fits_pattern(test_string)) 

Выход:

'03.38' 
True 
'10.59 ' 
True 
'10.23 m3/h' 
False 
'50.8 mm' 
False 
'ab.cd' 
False 
'12.3d' 
False 
'1234' 
False 
'12345' 
False 
'' 
False 
'  12.34  ' 
True 

Решение регулярное выражение будет:

import re 

def fits_pattern(s): 
    return re.match(r'\s*\d\d\.\d\d\s*', s) 

\s*: 0 или более пробелов (включая переводы строк, вкладки и т.д.) \d: a цифра \.: буква ., так как . сам по себе является чем-то другим. r'...': строковый литерал, полезный для регулярных выражений, чтобы не иметь нагрузок \ символов в строковом литерале.

0
from re import search 

l=['03.38', '10.59 ', '10.23 m3/h', '50.8 mm'] 
atext1=[] 
for i in l: 
    match=search('\d{2}\.\d{2}$',i.strip()) 
    if match: atext1.append(match.string) 



print(atext1) #['03.38', '10.59'] 

\d{2}\.\d{2}$ будет соответствовать любому элементу в l, что заканчивается с двумя цифрами, период и еще две цифры. i.strip() удаляет ведущие и завершающие пробелы - таким образом '10.59 ' станет '10.59' и соответствует этому регулярному выражению.

+0

У вас есть пакет 're'? вы можете проверить, введя 'help ('modules')' в вашей командной строке Python и посмотреть, находится ли она в списке. – LMc

+0

Большое спасибо за эту работу – Michal

+0

Что касается модификации, т.е. Ca.16 это будет \ C \ a \. \ D {2} $? для чего мы используем $ for? – Michal

0
for i in elements: 
    if not len(list(i.Text)) > 5: 
     if len(i.split('.')) > 0: 
      if i.split('.')[0:2].isdigit(): 
       if i.split('.')[3:].isdigit(): 
        print("Yes") 
+0

В строке 4 у меня есть SyntaxError: ожидается отложенный блок – Michal

+0

Нужна ли мне библиотека? _Warning: операция IronPythonEvaluator.EvaluateIronPythonScript завершилась неудачно. Traceback (самый последний вызов последнего): Файл "", строка 47, в AttributeError: объект 'TextNote' не имеет атрибута «split'_ – Michal

+0

@Michal, есть ошибка синтаксиса. Должен быть ':' в конце строки 4 – LMc

0
# being that you provided no details on how this info is stored, other than "a list of strings", I'm assuming it's stored like so: 
lst_info = ['11.11','1.11','22.11','22.22'] 

def is_number(s): 
    try: 
     float(s) 
     return True 
    except ValueError: 
     return False 


def function(p): 
    new_lst = [] 
    piece = [] 
    for e in p: 
     if len(e) > 4: 
      if (is_number(e[0:2]), is_number(e[3:]), e[2] == '.'): 
       piece.append([str(e)]) 
       piece.append([': Yes']) 
       new_lst.append(piece) 
       piece = [] 
     else: 
      piece.append([str(e)]) 
      piece.append([': No']) 
      new_lst.append(piece) 
      piece = [] 
    result = '' 
    for e in new_lst: 
     result += (' ' * (9 - len(str(e[0])))) + (str(e[0]) + ' | ' + str(e[1]) + '\n') 
    return result 

print function(lst_info) 
# prints 
['11.11'] | [': Yes'] 
['1.11'] | [': No'] 
['22.11'] | [': Yes'] 
['22.22'] | [': Yes'] 
Смежные вопросы