我有一个字符串:
A12B34C10G34LongerLongerEven LongerA57
有没有办法将上面的正则表达式分成以下形式:
A12,B34,C10,G34,Longer,Longer,Even Longer,A57
所以,用逗号分隔。我将不胜感激任何帮助。感谢。
答案 0 :(得分:3)
这可以满足您的需求:
<?php
$str = "A12B34C10G34LongerLongerEven LongerA57";
echo preg_replace('/([^\s])([A-Z])/', '\1,\2', $str), "\n";
// OUTPUT: A12,B34,C10,G34,Longer,Longer,Even Longer,A57
答案 1 :(得分:2)
preg_replace ('/\B([A-Z])/',',$1',$string);
在任何不在单词边界的大写字母之前插入逗号。
我的假设是输入数据可以包含大写字母,后跟数字和大写单词,可以用空格分隔,也可以不用空格分隔。
答案 2 :(得分:2)
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) )``
其中
(?![^A-Z])
或(?=[A-Z]|\Z)
将字符串的结尾视为匹配部分的可能结尾。
然后
我意识到,如果空格位于字符串的开头或结尾,则存在问题。上面的代码显示了哪些
为了防止这些问题,解决方案是2号的良好解决方案。但是它很难获得,所以1号好的解决方案显然是我最喜欢的解决方案。
答案 3 :(得分:1)
试试这个:
$in = 'A12B34C10G34LongerLongerEven LongerA57';
$output = trim(preg_replace('/([^\s])([A-Z])/', "$1,$2", $in),",");
echo $output;
输出:A12,B34,C10,G34,Longer,Longer,Even Longer,A57
答案 4 :(得分:1)
假设您要在每个不带空格的大写字符前面添加','
,这里是简单的Python regex
+ sub
方式。< / p>
string = 'A12B34C10G34LongerLongerEven LongerA57'
re.sub(r'(?<=[^ ])([A-Z])', lambda x: ',' + x.group(0), string)
输出:
'A12,B34,C10,G34,Longer,Longer,Even Longer,A57'
regex
使用lookbehind来检查非空格,并且匹配是一个高位字符。然后这个上部字符前面加','
。
答案 5 :(得分:0)
您可以使用此假设您不会在$in
explode(",", preg_replace('/([^\s])([A-Z]+)/', "$1,$2", $in);
我真的不懂python,但基本正则表达式是相同的。