单独(ir)正则表达式

时间:2013-03-05 09:02:24

标签: php python regex

我有一个字符串:

A12B34C10G34LongerLongerEven LongerA57

有没有办法将上面的正则表达式分成以下形式:

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

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

6 个答案:

答案 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,但基本正则表达式是相同的。