鱼C论坛

 找回密码
 立即注册
查看: 2873|回复: 6

[已解决]提出字符串的问题,求大师帮忙,谢谢

[复制链接]
发表于 2023-5-2 16:44:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
text = '通用设备70/195|祥鑫科技33/195通用设备;泰嘉股份107/195通用设备'
我想以“|”为界:
           前部分提出字符串:通用设备
           后面部分提出字符串:祥鑫科技,泰嘉股份,即凡是字符开头后面带数字的提出(祥鑫科技33/195,泰嘉股份107/195),但不要数字

求大师帮忙,谢谢
最佳答案
2023-5-2 16:46:06
可以使用字符串的split函数和正则表达式来实现。

1. 以"|"为界,将字符串分成两部分:

  1. parts = text.split("|")
复制代码


2. 前面部分的字符串即为parts[0],提出即可:

  1. first_part = parts[0]  # "通用设备"
复制代码


3. 后面部分的字符串即为parts[1],我们可以使用正则表达式来提取出所有符合要求的内容。具体来说,我们需要匹配所有的字母和汉字,紧跟着一个数字,然后紧跟着斜杠和数字。使用以下正则表达式即可:

  1. import re

  2. regex = r"([\u4e00-\u9fa5a-zA-Z]+)\d+/\d+"
复制代码


这个正则表达式的意思是先匹配一个汉字或字母,然后匹配一个或多个数字,然后匹配一个斜杠,最后匹配一个或多个数字。我们将汉字或字母使用()包起来,表示我们想提取这部分内容。

4. 然后使用re模块的findall函数来查找所有匹配的内容:

  1. matches = re.findall(regex, parts[1])
复制代码


5. matches即为所有符合要求的字符串列表,我们可以使用join函数将它们拼接成一个字符串:

  1. second_part = ",".join(matches)  # "祥鑫科技,泰嘉股份"
复制代码


完整代码如下:

  1. import re

  2. text = '通用设备70/195|祥鑫科技33/195通用设备;泰嘉股份107/195通用设备'

  3. parts = text.split("|")
  4. first_part = parts[0]

  5. regex = r"([\u4e00-\u9fa5a-zA-Z]+)\d+/\d+"
  6. matches = re.findall(regex, parts[1])
  7. second_part = ",".join(matches)

  8. print(first_part)  # "通用设备"
  9. print(second_part)  # "祥鑫科技,泰嘉股份"
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-2 16:45:48 | 显示全部楼层
本帖最后由 陶远航 于 2023-5-2 16:49 编辑

你可以使用正则表达式来匹配你需要的字符串,然后提取出匹配的内容。

代码如下:
  1. import re

  2. text = '通用设备70/195|祥鑫科技33/195通用设备;泰嘉股份107/195通用设备'

  3. # 匹配前部分字符串
  4. pattern1 = r'(.+?)\d*/\d*\|'
  5. match1 = re.search(pattern1, text)
  6. if match1:
  7.     part1 = match1.group(1)
  8. else:
  9.     part1 = ''

  10. # 匹配后部分字符串
  11. pattern2 = r'\b([a-zA-Z]+)[^\d]*'
  12. match2 = re.findall(pattern2, text)
  13. part2 = '|'.join(match2)

  14. print(part1)
  15. print(part2)
复制代码

输出:
  1. 通用设备
  2. 祥鑫科技|泰嘉股份
复制代码

解释:

第一个正则表达式 (.+?)\d*/\d*\| 匹配以数字和斜杠组成的字符串(如70/195),以及在此之前的所有字符,直到遇到竖杠 |。由于匹配字符部分使用了非贪婪匹配,即加上 ?,这样可以保证匹配最短的字符串,避免误匹配。
第二个正则表达式 \b([a-zA-Z]+)[^\d]* 匹配所有以字母开头,后面跟着非数字字符的单词。由于不需要提取单词后面的数字,因此在匹配后缀部分时使用了否定字符组 [^\d]*,以匹配非数字字符。
最后,将匹配到的字符串通过 join() 方法组合起来即可。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 16:46:06 | 显示全部楼层    本楼为最佳答案   
可以使用字符串的split函数和正则表达式来实现。

1. 以"|"为界,将字符串分成两部分:

  1. parts = text.split("|")
复制代码


2. 前面部分的字符串即为parts[0],提出即可:

  1. first_part = parts[0]  # "通用设备"
复制代码


3. 后面部分的字符串即为parts[1],我们可以使用正则表达式来提取出所有符合要求的内容。具体来说,我们需要匹配所有的字母和汉字,紧跟着一个数字,然后紧跟着斜杠和数字。使用以下正则表达式即可:

  1. import re

  2. regex = r"([\u4e00-\u9fa5a-zA-Z]+)\d+/\d+"
复制代码


这个正则表达式的意思是先匹配一个汉字或字母,然后匹配一个或多个数字,然后匹配一个斜杠,最后匹配一个或多个数字。我们将汉字或字母使用()包起来,表示我们想提取这部分内容。

4. 然后使用re模块的findall函数来查找所有匹配的内容:

  1. matches = re.findall(regex, parts[1])
复制代码


5. matches即为所有符合要求的字符串列表,我们可以使用join函数将它们拼接成一个字符串:

  1. second_part = ",".join(matches)  # "祥鑫科技,泰嘉股份"
复制代码


完整代码如下:

  1. import re

  2. text = '通用设备70/195|祥鑫科技33/195通用设备;泰嘉股份107/195通用设备'

  3. parts = text.split("|")
  4. first_part = parts[0]

  5. regex = r"([\u4e00-\u9fa5a-zA-Z]+)\d+/\d+"
  6. matches = re.findall(regex, parts[1])
  7. second_part = ",".join(matches)

  8. print(first_part)  # "通用设备"
  9. print(second_part)  # "祥鑫科技,泰嘉股份"
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 16:53:33 | 显示全部楼层
  1. text = '通用设备70/195|祥鑫科技33/195通用设备;泰嘉股份107/195通用设备'

  2. # 以“|”为界分割字符串
  3. parts = text.split("|")

  4. # 前部分提取字符串
  5. front_string = parts[0]

  6. # 后面部分提出字符串
  7. back_strings = []
  8. for part in parts[1:]:
  9.     # 寻找第一个数字的位置
  10.     for index in range(len(part)):
  11.         if part[index].isdigit():
  12.             break
  13.     name = part[:index]  # 取出除数字外的部分
  14.     back_strings.append(name)

  15. print(f"前部分提取字符串:{front_string}")
  16. print(f"后部分提取字符串:{back_strings}")
复制代码

输出:

前部分提取字符串:通用设备
后部分提取字符串:['祥鑫科技', '泰嘉股份']
有用请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-2 16:59:20 | 显示全部楼层
本帖最后由 futui 于 2023-5-2 17:08 编辑

陶远航大师第一部分出结果,isdkz大师和sfqxx大师第二部分有结果,isdkz第二部分可以一次把我要的三个结果全提出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 17:03:37 | 显示全部楼层
futui 发表于 2023-5-2 16:59
陶远航大师第一部分出结果,isdkz和sfqxx第二部分有结果,isdkz第二部分可以一次把我要的三个结果全提出来

。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 18:09:39 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-29 06:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表