我有一个字符串:
A12B34C10G34LongerLongerEven LongerA57
有没有办法使用正则表达式将上述内容分隔为:
A12,B34,C10,G34,Longer,Longer,Even Longer,A57
所以,用逗号分隔。如果有任何帮助,我将不胜感激。谢谢。
这给了你需要的东西:
<?php
$str = "A12B34C10G34LongerLongerEven LongerA57";
echo preg_replace('/([^\s])([A-Z])/', '\1,\2', $str), "\n";
// OUTPUT: A12,B34,C10,G34,Longer,Longer,Even Longer,A57
import re
ss = ' \tA12B34C10#G34LongerVery LongerEven LongerA57 \n'
print '%r\n%r\n\n%r' %\
(
#good 1
re.sub('(?<=\S)(?=[A-Z])', ',', ss),
#good 2
','.join(
re.findall('(\s*[A-Z].+?\s*)(?=(?<=\S)[A-Z]|\s*\Z)',ss)
),
#bad (written at first)
','.join(
re.findall('(?<!\s)([A-Z].+?)(?<!\s)(?![^A-Z])',ss)
)
)
结果
' \tA12,B34,C10#,G34,Longer,Very Longer,Even Longer,A57 \n'
' \tA12,B34,C10#,G34,Longer,Very Longer,Even Longer,A57 \n'
'B34,C10#,G34,Longer,Very Longer,Even Longer'
.
第一个解决方案尽可能接近想法(插入逗号)。
(?<=\S)
在此解决方案中是强制性的,因为必须在字符之间插入每个逗号(来自 DJV 的更正)
(?<!\s)
将匹配字符串的开头,并且逗号将被添加到第一个位置。
.
在第一次写作中,我将第二个解决方案写为
# bad
','.join(re.findall( '(?<!\s)([A-Z].+?)(?<!\s)(?![^A-Z])', ss) )
或者
# bad
``','.join(re.findall( '(?<!\s)([A-Z].+?)(?<!\s)(?=[A-Z]|\Z)', ss) )``
where
(?![^A-Z])
or (?=[A-Z]|\Z)
were to take the end of the string as a possible end of matching part. 将字符串的结尾视为匹配部分的可能结尾。
然后
我意识到,如果空格在字符串的开头或结尾,就会有问题。上面的代码显示了哪些。
为了防止这些问题,解决方案是好的解决方案2。但它是一个更难获得的复杂解决方案,所以好的解决方案1显然是我的首选。
preg_replace ('/\B([A-Z])/',',$1',$string);
在任何不在单词边界上的大写字母之前插入逗号。
我的假设是输入数据可以由大写字母后跟数字和大写单词组成,这些单词可能被空格分隔,也可能不被空格分隔。
尝试这个 :
$in = 'A12B34C10G34LongerLongerEven LongerA57';
$output = trim(preg_replace('/([^\s])([A-Z])/', "$1,$2", $in),",");
echo $output;
输出 :A12,B34,C10,G34,Longer,Longer,Even Longer,A57
假设您想','
在每个前面没有空格的大写字符前面添加一个,这里是简单的 Python regex
+sub
方法。
string = 'A12B34C10G34LongerLongerEven LongerA57'
re.sub(r'(?<=[^ ])([A-Z])', lambda x: ',' + x.group(0), string)
输出:
'A12,B34,C10,G34,Longer,Longer,Even Longer,A57'
向后检查以regex
检查非空格并且匹配是大写字符。然后这个上面的 char 前面加上一个','
.
你可以使用这个假设你不会在任何地方得到逗号$in
explode(",", preg_replace('/([^\s])([A-Z]+)/', "$1,$2", $in);
我真的不知道python,但基本的正则表达式是一样的。