0

我有一个字符串:

A12B34C10G34LongerLongerEven LongerA57

有没有办法使用正则表达式将上述内容分隔为:

A12,B34,C10,G34,Longer,Longer,Even Longer,A57

所以,用逗号分隔。如果有任何帮助,我将不胜感激。谢谢。

4

6 回答 6

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
于 2013-03-05T09:06:54.483 回答
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) )`` 

where
(?![^A-Z])or (?=[A-Z]|\Z)were to take the end of the string as a possible end of matching part. 将字符串的结尾视为匹配部分的可能结尾。
然后
我意识到,如果空格在字符串的开头或结尾,就会有问题。上面的代码显示了哪些。
为了防止这些问题,解决方案是好的解决方案2。但它是一个更难获得的复杂解决方案,所以好的解决方案1显然是我的首选。

于 2013-03-05T12:44:36.657 回答
2
preg_replace ('/\B([A-Z])/',',$1',$string);

在任何不在单词边界上的大写字母之前插入逗号。

我的假设是输入数据可以由大写字母后跟数字和大写单词组成,这些单词可能被空格分隔,也可能不被空格分隔。

于 2013-03-05T09:08:16.787 回答
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

于 2013-03-05T09:09:08.123 回答
1

假设您想','在每个前面没有空格的大写字符前面添加一个,这里是简单的 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 前面加上一个','.

于 2013-03-05T09:46:03.430 回答
0

你可以使用这个假设你不会在任何地方得到逗号$in

explode(",", preg_replace('/([^\s])([A-Z]+)/', "$1,$2", $in);

我真的不知道python,但基本的正则表达式是一样的。

于 2013-03-05T09:05:52.317 回答