倚楼听雨落 发表于 2020-12-14 11:40:09

关于正则表达式处理字符串的问题

我在用正则表达式处理字符串的时候遇到点问题,一直没有想明白怎么解决,请各位给指导一下。
我现在有以下字符串:
CMA_Rear_Door_plan_1856669_DC01_2p5mm
CMA_Rear_Door_LH_plan_18566659_DC01_0p5mm
CMA_Rear_Door_RH_plan_1856669_1p5mm_30CrMnTi
CX11_Rear_Door_Front_plan_1856669_3p5mm_PC_GF50
980010_Rear_Door_plan_1856669_0p8mm_PC_ABS

现在是想将上面的字符串分别将里面的2p5、0p5、1p5、3p5、0p8用正则表达式匹配出来,请问各位这个正则表达式要怎么写啊,头都快抓秃了。{:10_266:}

Brick_Porter 发表于 2020-12-14 13:13:18

import re

s = """CMA_Rear_Door_plan_1856669_DC01_2p5mm
CMA_Rear_Door_LH_plan_18566659_DC01_0p5mm
CMA_Rear_Door_RH_plan_1856669_1p5mm_30CrMnTi
CX11_Rear_Door_Front_plan_1856669_3p5mm_PC_GF50
980010_Rear_Door_plan_1856669_0p8mm_PC_ABS"""

regex = re.compile("\dp\d")
mo = regex.findall(s)
print(mo)

既然格式都是“数字p数字”那就比较简单了

倚楼听雨落 发表于 2020-12-14 19:33:36

Brick_Porter 发表于 2020-12-14 13:13
既然格式都是“数字p数字”那就比较简单了

我在外边这么测试也是可以正常的得到结果,但是我在对其他软件做二次开发的时候得到的都是空的列表,感觉特别奇怪,你能帮我看看我写的代码有啥问题不?
以下为测试用的代码:


import re
import ansa
from ansa import base
from ansa import constants
from ansa import guitk

#程序修饰器,生成一个分组和对应的脚本按钮,以及对脚本的一些介绍。
@ansa.session.defbutton("测试专用","啥都有","专门用来测试的脚本")

def TestAnything():
       
        TopWindow = guitk.BCWindowCreate("TITLE", guitk.constants.BCOnExitDestroy)
        #创建一个窗口,并给窗口命名。
        guitk.BCSetCaption(TopWindow, "功能")
        #创建窗口选项
        BCBoxLayout_1 = guitk.BCBoxLayoutCreate(TopWindow, guitk.constants.BCHorizontal)
        BCLabel_1 = guitk.BCLabelCreate(BCBoxLayout_1, "选项 :")
        CVals_0 = ("测试Prop","测试PropName")
        BCComboBox =
        guitk.BCComboBoxSetActivatedTextFunction(BCComboBox, _DeckTest, None)
        #创建OK按钮和Cancel按钮
        BCDialogButtonBox_1 = guitk.BCDialogButtonBoxCreate(TopWindow)
        guitk.BCWindowSetAcceptFunction(TopWindow, _OkPressed, BCComboBox)
        guitk.BCWindowSetRejectFunction(TopWindow, _CancelPressed, None)
        guitk.BCShow(TopWindow)
       
def _DeckTest(combo, text, data):

        print("你当前选的功能是 : "+text)
        return 0
       
def _OkPressed(w, data):
       
        deck = guitk.BCComboBoxCurrentText(data)
       
        if deck == "测试Prop":
                print("选择需要测试的properties!")
                EntsType = ("SECTION_SHELL","SECTION_SOLID","SECTION_BEAM","SECTION_DISCRETE","SECTION_SEATBELT","SECTION_BEAM_ELFORM_6")#定义一个单元类型的元组。
                base.SetPickMethod(base.constants.PID_SELECTION)#通过PID来选择需要修改名字的Prop。
                Results_Prop = base.PickEntities(constants.LSDYNA, EntsType)#将选择的对象保存到Results_Prop中。
               

                for ent in Results_Prop:
                       
                        Prop = base.GetEntityCardValues(constants.LSDYNA,ent,("Name","PID","MID","T1","SECID","USER_SECID",)) #通过for循环将选中的对象名字提取出来。
                       
                        ProName = Prop["Name"]
                        ProPID = Prop["PID"]
                        ProMID = Prop["MID"]
                        ProT = Prop["T1"]
                        ProSecid = Prop["SECID"]
                        ProUserSec = Prop["USER_SECID"]
                       
                        print(ProName)
                        print(ProPID)
                        print(ProMID)
                        print(ProT)
                        print(ProSecid)
                        print(ProUserSec)


        if deck == "测试PropName":
                print("选择需要测试的properties!")
                EntsType = ("SECTION_SHELL","SECTION_SOLID","SECTION_BEAM","SECTION_DISCRETE","SECTION_SEATBELT","SECTION_BEAM_ELFORM_6")#定义一个单元类型的元组。
                base.SetPickMethod(base.constants.PID_SELECTION)#通过PID来选择需要修改名字的Prop。
                Results_Prop = base.PickEntities(constants.LSDYNA, EntsType)#将选择的对象保存到Results_Prop中。
               

                for ent in Results_Prop:
                       
                        Prop = base.GetEntityCardValues(constants.LSDYNA,ent,("Name",)) #通过for循环将选中的对象名字提取出来。
                       
                        ProName = Prop["Name"]
                       
                        PropName = str(ProName)
                       
                        print(ProName)
                        print(PropName)
                       
                       
                        regex_name = re.compile("_\dp\d")
                        thickness = regex_name.findall(PropName)
                        print(thickness)
                       

def _CancelPressed(w, data):
        print("搞完了,拜拜!!!")
        return 1


以下为输出的结果:

Reading script from :D:/ansa_scripts/test_000000.py
Generating code...
Code generation completed.
你当前选的功能是 : 测试PropName
选择需要测试的properties!
None
None
None
搞完了,拜拜!!!
Reading script from :D:/ansa_scripts/test_000000.py
Generating code...
Code generation completed.
你当前选的功能是 : 测试PropName
选择需要测试的properties!
None
搞完了,拜拜!!!
Reading script from :D:/ansa_scripts/test_000000.py
Generating code...
Code generation completed.
你当前选的功能是 : 测试PropName
选择需要测试的properties!
[]
搞完了,拜拜!!!
Reading script from :D:/ansa_scripts/test_000000.py
Generating code...
Code generation completed.
你当前选的功能是 : 测试PropName
选择需要测试的properties!
185023_LH_Dr_Fr_Reinf_Rear_Intru_2P2mm
[]
搞完了,拜拜!!!
Reading script from :D:/ansa_scripts/test_000000.py
Generating code...
Code generation completed.
你当前选的功能是 : 测试PropName
选择需要测试的properties!
185245_LH_Dr_Fr_Plate_Hinge_up_2P6mm
185245_LH_Dr_Fr_Plate_Hinge_up_2P6mm
[]
搞完了,拜拜!!!
Reading script from :D:/ansa_scripts/test_000000.py
Generating code...
Code generation completed.
你当前选的功能是 : 测试PropName
选择需要测试的properties!
185021_LH_Dr_Fr_Reinf_Front_Intr_2P3mm
185021_LH_Dr_Fr_Reinf_Front_Intr_2P3mm
[]
搞完了,拜拜!!!



使用的是该软件自带的简易IDE


帮忙看看是什么问题,非常感谢。

Brick_Porter 发表于 2020-12-14 22:13:28

倚楼听雨落 发表于 2020-12-14 19:33
我在外边这么测试也是可以正常的得到结果,但是我在对其他软件做二次开发的时候得到的都是空的列表,感觉 ...

有没有注意到P是大写的?重新调整一下正则然后试试

倚楼听雨落 发表于 2020-12-15 20:32:01

Brick_Porter 发表于 2020-12-14 22:13
有没有注意到P是大写的?重新调整一下正则然后试试

是我大意了,确实是因为这个的原因。{:10_266:}
页: [1]
查看完整版本: 关于正则表达式处理字符串的问题