【问题标题】:How to extract from list items that are 2digits"."2digits only in Iron Python?如何从 2 位数的列表项中提取“。”仅在 Ironpython 中的 2 位数?
【发布时间】:2017-03-25 00:12:21
【问题描述】:

我有字符串列表,需要找到所有符合这个逻辑的字符串

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

【问题讨论】:

  • 是的,当然列表在顶部,这里是示例 [03.38, 10.59, 10.23 m3/h, 50.8 mm, koza, VCD, 48l/s, 10.203, 02.72, 03.55。 ]
  • 10.23 m3/h 的情况下,您是要提取10.23 还是完全跳过它,因为它不只包含twodigits.twodigits
  • 我想跳过它......我还需要将它插入到我的 if 中,因为我需要为列表中的每个项目替换此文本并且如果匹配则替换为 None 所以 i.Text= '' 此行如下
  • 鉴于您在上面发布的示例,您能否发布预期输出的示例?
  • 感谢所有这些令人惊叹的选项...这对我来说看起来有点复杂,不知道如何在我的代码中实现。我使用 Dynamo 并连接到 Revit。所以我有 10000 个元素阅读文本并有列表。如果与我的模式匹配,则需要查找每个索引,然后运行行以用 Nothing ( i.Text= '' ) 替换此索引值。正如我上面的代码......让我尝试所有这些选项

标签: python python-2.7 filtering


【解决方案1】:
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:一个数字 \.:文字 .,因为 . 本身就是不同的东西。 r'...':原始字符串文字,对正则表达式很有用,可避免在字符串文字中包含大量 \ 字符。

【讨论】:

    【解决方案2】:
    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' 并匹配这个正则表达式。

    【讨论】:

    • 您是否安装了re 软件包?您可以通过在 Python 命令行中输入 help('modules') 来检查它是否在列表中。
    • 如何修改,即。 Ca.16 这将是 \C\a\.\d{2}$ ?我们用 $ 做什么?
    • @michal $ 本质上意味着“以”结尾。说 'abc$' 意味着您正在尝试匹配以 "abc" 结尾的字符串。这将匹配“123abc”,但不匹配“123abc1”。
    【解决方案3】:
    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")
    

    【讨论】:

    • 在第 4 行我有 SyntaxError: expected an indented block
    • 我需要任何库吗? 警告:IronPythonEvaluator.EvaluateIronPythonScript 操作失败。 Traceback(最近一次调用最后):文件“”,第 47 行,在 AttributeError: 'TextNote' object has no attribute 'split'
    • @Michal,存在语法错误。应该是第 4 行末尾的 :
    • @LMc 你的意思是第 3 行 if len(i.split('.')) > 0:
    • 这段代码看起来很清晰,但是 if k.split('.')[0:2].isdigit(): 这行代码对我不起作用
    【解决方案4】:
    # 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']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      相关资源
      最近更新 更多