首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Regex用于使用可选分隔符(char)拆分字符串。

Regex用于使用可选分隔符(char)拆分字符串。
EN

Stack Overflow用户
提问于 2021-09-26 22:33:57
回答 3查看 121关注 0票数 0

我有一个看起来像这样的字符串: new_tt_j1213。

我需要把它分成'new','tt',‘j 1213’。

字符串规则:

  1. 前三个字符总是字母

  1. 在第一个'_‘之后(如果它存在的话),只有两个字母只有

  1. 在第二个'_‘之后(如果它存在的话),有t1524或t014格式(第一个符号总是一个字母,可以有3或4个数字)

  1. 所有字母都是小写的

  1. '_‘可能因腐败而丢失

使用拆分()方法非常容易,但由于数据损坏,有时缺少第一个下划线:'newtt_j1213‘

由于我对Regex非常陌生,您能帮我调整下面的代码吗?即使没有第一个'_‘,拆分也能像前面描述的那样工作。(甚至没有第二个下划线)?

代码语言:javascript
运行
复制
 p1 =''
 p2 =''
 p3 =''

str_t = 'newtt_j123'
str_t1 = 'new_tt_j1213'
str_t2 = 'newttj1213'
str3 = 'new_ttj1213'

#   Test for data Corruption
 tr_lst = re.split('_', str_t)   
 if len(tr_lst) <3: print('DATA CORRUPTION - ',tr_lst)     
    
 p1, p2, p3 = re.split('_', str_t) # THIS LINE NEEDS ADJUSTMENT (REGEX?)
 print(p1, p2, p3, str_t)

谢谢你!!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-26 23:29:25

据我所知,你可以不用regex就能做到。

首先,删除所有_ (如果有s.replace('_', '') ),然后使用括号提取如下所示:

代码语言:javascript
运行
复制
s = "newtt_j1213"
s = s.replace('_', '')
ss = [ s[0:3], s[3:5], s[5:] ]
print(ss)

输出:['new', 'tt', 'j1213']

票数 1
EN

Stack Overflow用户

发布于 2021-09-26 22:36:44

假设您的字符串以"ABB_CCCCC“或"A_BB_CCCCC”的形式存在,并且您希望提取A/BB/CCCCC。

你可以用:

代码语言:javascript
运行
复制
import re
re.findall('(.)_?([^_]+)_(.+)', your_string)[0]

NB1。如果您总是有一个字符,两个字符,五个字符,请使用:`‘(.)?(.)(.{5})“”

NB2。这里假设字符串对一个或另一个公式是有效的,否则就没有匹配和IndexError。

示例:

代码语言:javascript
运行
复制
s1 = 'n_tt_j1213'
re.findall('(.)_?([^_]+)_(.+)', your_string)[0]
代码语言:javascript
运行
复制
s2 = 'ntt_j1213'
re.findall('(.)_?([^_]+)_(.+)', your_string)[0]

这两方面的产出:

代码语言:javascript
运行
复制
('n', 'tt', 'j1213')
票数 1
EN

Stack Overflow用户

发布于 2021-09-26 23:15:26

我就是这样做的:

代码语言:javascript
运行
复制
import re

regex = re.compile('^([a-z]{3}).*([a-z]{2}).*([a-z]{1}\d{3})$')
matches = re.search(regex, 'newtt_j123')
print(matches.groups())

OUT:('new', 'tt', 'j123')

regex的工作方式如下:^([a-z]{3})将匹配定位到字符串的开头,然后匹配3个小写字母,并将其存储在第一个捕获组中。any是一个字符类,它意味着任何小写字母,花括号中的3表示长度必须是3。它在一个捕获组中,因为它在普通括号中(即() )。

然后贪婪地将任何内容与.*匹配,直到下一个捕获组,并将任意两个小写字母与([a-z]{2})匹配。

然后,再一次贪婪地将直到最后一个捕获组的任何内容与([a-z]{1}\d{3})匹配。这将匹配由\d表示的三个数字旁边的一个小写字母。

然后,当你打印出matches.groups(),你将得到匹配的顺序,即第一个将是三个字母,下一个将是下两个字母,最后一个将是字母后面的三个数字。

我还使用^$将匹配锚定到字符串的开始和结束。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69339477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档