【问题标题】:Using a variable in a findall search在 findall 搜索中使用变量
【发布时间】:2018-05-27 15:09:04
【问题描述】:

好的,我正在从我创建的字典 (DoL) 中读取一个变量:

for i in DoL.keys():
    fobId = DoL["{}".format(i)]["FaceOuterBound"]

可以说,在 DoL 的第一次迭代中:

fobId = 194

我试图创建一个包含变量 fobId 的正则表达式 findall:

edgeloop_txt = re.findall(r'^#'+str(fobId)+r'.*#(\d+).*;', text)

为了找到text中以#fobId开头的行:

#194 = FACE_OUTER_BOUND ( 'NONE', #159, .T. ) ;

最后提取数字#159

我的输出 print(edgeloop_txt) 只是给了我空列表:

[]
[] 
[]
...

编辑(提供 MCVE):

示例文本:

...
#190 = DIRECTION ( 'NONE',  ( -1.000000000000000000, -0.0000000000000000000, -0.0000000000000000000 ) ) ;
#191 = DATE_AND_TIME ( #277, #349 ) ;
#192 = ORIENTED_EDGE ( 'NONE', *, *, #253, .T. ) ;
#193 = CARTESIAN_POINT ( 'NONE',  ( 75.00000000000000000, 35.00000000000000000, 0.0000000000000000000 ) ) ;
#194 = FACE_OUTER_BOUND ( 'NONE', #159, .T. ) ;
#195 = ORIENTED_EDGE ( 'NONE', *, *, #205, .T. ) ;
#196 = CARTESIAN_POINT ( 'NONE',  ( 0.0000000000000000000, 35.00000000000000000, 0.0000000000000000000 ) ) ;
...

我正在使用的代码:

for i in DoL.keys():
    fobId = DoL["{}".format(i)]["FaceOuterBound"]
    edgeloop_txt = re.findall(r'^#'+str(fobId)+r'.*#(\d+).*;', text)
    print(edgeloop_txt)

DoL 是这样的字典:

{'Face0': {'AdvancedFace': 12, 'FaceOuterBound': 194, 'Plane': 326}, 
'Face1': {'AdvancedFace': 73, 'FaceOuterBound': 53, 'Plane': 230}, 
'Face2': {'AdvancedFace': 99, 'FaceOuterBound': 121, 'Plane': 123}, 
'Face3': {'AdvancedFace': 131, 'FaceOuterBound': 268, 'Plane': 270}, 
...
'Face9': {'AdvancedFace': 358, 'FaceOuterBound': 9, 'Plane': 363}}

【问题讨论】:

  • 您的示例文本是什么样的?
  • @MCBama 示例文本为 #194 = FACE_OUTER_BOUND ( 'NONE', #159, .T. ) ;
  • 这一定要用正则表达式吗?
  • 好的,您是从文件中读取还是文本对象已经存在?您可能想发布完整的代码 sn-p(堆栈帮助中心描述的 MCVE)
  • 我看不出字典与这个问题有什么关系。基本的东西works

标签: python regex findall cad step


【解决方案1】:

好的,我想我已经解决了您的问题。您正在使用一大块文本,但您的正则表达式中有一个 ^ 表示行首。问题是你没有迭代你正在一次解析整个文本的行,因为你这样做是因为你的正则表达式行开始字符会阻止你找到匹配项。

您的选择是逐行遍历您的文本,或者只是从您的正则表达式中删除^

逐行迭代示例:

for key,val in DoL.items():
  fobId = val["FaceOuterBound"]
  matches = []
  for line in text.splitlines():
    # split text into lines and compare to each line
    response = re.match(r'^#'+str(fobId)+r'.*#(\d+).*;', line)
    # if a match was found, store it in list of matches
    if response: matches.append(response[1])
  print(matches) # ['159']

【讨论】:

  • 所以我将 ^ 从正则表达式中取出。输出的第一行变为:['326', '159'] 因此,正则表达式似乎正在拾取它在任何位置找到 #194 的行,而不是不仅仅是以#194开始的行...
  • @DarrenTaggart 是的,如果您不想自己遍历行,您可能还需要修改正则表达式以包含换行符的搜索。我将添加一个示例行迭代工具,但它看起来会更复杂一些,并且可能会有更长的运行时间。
  • 我能够通过简单地在正则表达式的开头添加一个\n 来解决这个问题。但是现在我遇到了一个问题,即 #14 号也会接 #140、#141、#142.. 等等!
  • 你的问题是你的正则表达式。最简单的可能是这样的:r'#'+str(fobId)+r' = .*#(\d+).*;' 在其中添加等号应该保证你得到你正在寻找的数字
猜你喜欢
  • 2016-06-03
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2021-04-15
  • 1970-01-01
相关资源
最近更新 更多