Python正则表达式获取与特定条件匹配的第一个字母和最后一个单词

2024-06-02 18:32:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的句子,我试图提取以“R”开头的行,提取以R开头的行的最后一个空格后的单词,然后连接第一个字母和最后一个单词

text_raw = """
FIG
ITEM PART NUMBER NOMENCLATURE
1 2 3 4 5 6 7
EFFECT
FROM TO
PER
ASSY
1 
  ...SCREW- 102913 6600 XY14678-10
  STANDARD SUBSTITUTION:      
       JK784678-19     
       SDFG12HL3H8     
  ...PIN- 007999 8105 BHF343212WO
  ...PIN- 007999 8105 DF960-23H
  STANDARD SUBSTITUTION:      
            D89SJA
R ...SEAL-CHECK 007999 2110 NAS21134-10F             <<<<< this line
R     SUPPLIER CODE:      
R      D89SJA     
R     FUNCTIONAL DESCRIPTION:      
R      THE SWING CHECK VALVE IS     
R      TO LOCK AIR PREVENTION     
R      DUE FROM THE LEAK     
R      COMPARTMENT.       
      
  ...SCREW- 102913 6600 XY14678-10
  STANDARD SUBSTITUTION:      
       JK784678-19     
       SDFG12HL3H8     
  ...PIN- 007999 8105 BHF343212WO
  ...PIN- 007999 8105 DF960-23H
  STANDARD SUBSTITUTION:      
            D89SJA
R .PROFILE BLOCK ASSY-BRAKE    445 11W3421-30       <<<<< this line
R     SUPPLIER CODE:      
R      D89SJA     
R     FUNCTIONAL DESCRIPTION:      
R      THE BRAKE CHECK VALVE IS     
R      TO LOCK ANTI PREVENTION     
R      DUE FROM THE LEAK     
R      BRAKE.     
"""

我能够使用以下代码获得以R开头的行

body = []
part_no = []
regex = re.compile(r"R[\s\S]*$")
for line in text_raw.split('\n'):
  if regex.match(line):
    print(line)


R ...SEAL-CHECK 007999 2110 NAS21134-10F    
R     SUPPLIER CODE:      
R      D89SJA     
R     FUNCTIONAL DESCRIPTION:      
R      THE SWING CHECK VALVE IS     
R      TO LOCK AIR PREVENTION     
R      DUE FROM THE LEAK     
R      COMPARTMENT.       
R .PROFILE BLOCK ASSY-BRAKE    445 11W3421-30
R     SUPPLIER CODE:      
R      D89SJA     
R     FUNCTIONAL DESCRIPTION:      
R      THE BRAKE CHECK VALVE IS     
R      TO LOCK ANTI PREVENTION     
R      DUE FROM THE LEAK     
R      BRAKE.


使用这个正则表达式,我能够正确地得到最后一个单词

body_str = "\n".join(body)
last_word = re.findall(r"[^\s]+$", body_str, re.MULTILINE)

['NAS21134-10F', '11W3421-30']

我要寻找的是,对于同时满足正则表达式“[^\s]+$”和“[^\s]+$”的行,将第一个字母和最后一个单词连接起来。 如何获得以下预期结果

['R - NAS21134-10F', 'R - 11W3421-30']

谢谢你的帮助


Tags: thetofromchecklinepincode单词
1条回答
网友
1楼 · 发布于 2024-06-02 18:32:00

我认为您可以使用一个表达式来获取2个值,然后在R - 前面加上前缀来捕获组1

^R[^\S\r\n].*[^\S\r\n](\S+)$

模式匹配:

  • ^字符串的开头
  • R[^\S\r\n]匹配{}和没有换行符的空格
  • .*[^\S\r\n]匹配整行,然后匹配没有换行符的最后一个空格
  • (\S+)捕获组1,匹配1+非空白字符
  • $字符串的结尾

Regex demoPython demo

(从示例数据中删除注释)

for s in re.findall(r"^R[^\S\r\n].*[^\S\r\n](\S+)$", text_raw, re.MULTILINE):
    print (f"R - {s}")

输出

R - NAS21134-10F
R - 11W3421-30

捕获R{}或D时,您可以使用两个捕获组和一个字符类([RND])

for s in re.findall(r"^([RND])[^\S\r\n].*[^\S\r\n](\S+)$", text_raw, re.MULTILINE):
    print (f"{s[0]} - {s[1]}")

相关问题 更多 >