鱼C论坛

 找回密码
 立即注册
查看: 1848|回复: 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. 以"|"为界,将字符串分成两部分:
parts = text.split("|")

2. 前面部分的字符串即为parts[0],提出即可:
first_part = parts[0]  # "通用设备"

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

regex = r"([\u4e00-\u9fa5a-zA-Z]+)\d+/\d+"

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

4. 然后使用re模块的findall函数来查找所有匹配的内容:
matches = re.findall(regex, parts[1])

5. matches即为所有符合要求的字符串列表,我们可以使用join函数将它们拼接成一个字符串:
second_part = ",".join(matches)  # "祥鑫科技,泰嘉股份"

完整代码如下:
import re

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

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

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

print(first_part)  # "通用设备"
print(second_part)  # "祥鑫科技,泰嘉股份"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

代码如下:
import re

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

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

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

print(part1)
print(part2)
输出:
通用设备
祥鑫科技|泰嘉股份
解释:

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

使用道具 举报

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

1. 以"|"为界,将字符串分成两部分:
parts = text.split("|")

2. 前面部分的字符串即为parts[0],提出即可:
first_part = parts[0]  # "通用设备"

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

regex = r"([\u4e00-\u9fa5a-zA-Z]+)\d+/\d+"

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

4. 然后使用re模块的findall函数来查找所有匹配的内容:
matches = re.findall(regex, parts[1])

5. matches即为所有符合要求的字符串列表,我们可以使用join函数将它们拼接成一个字符串:
second_part = ",".join(matches)  # "祥鑫科技,泰嘉股份"

完整代码如下:
import re

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

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

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

print(first_part)  # "通用设备"
print(second_part)  # "祥鑫科技,泰嘉股份"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

print(f"前部分提取字符串:{front_string}")
print(f"后部分提取字符串:{back_strings}")
输出:

前部分提取字符串:通用设备
后部分提取字符串:['祥鑫科技', '泰嘉股份']
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

陶远航大师第一部分出结果,isdkz大师和sfqxx大师第二部分有结果,isdkz第二部分可以一次把我要的三个结果全提出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 18:09:39 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 11:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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