将Perl中的split函数翻译为Python中的split函数。

3

在Perl中:

split(/(?<=[KR])/,$mystring)

通过“在每个字符之间分割”(=空字符串)+“向后查找”的两个概念,将我的字符串在每个K或R之后分割。因此,序列AAAKBBBBR成为(AAAK,BBBR)。

在python中有什么对应的方法?我找不到方法,因为空字符串不能在字符之间分割!


请看http://stackoverflow.com/questions/22748123/python-positive-lookbehind-split-variable-width的第一个答案。 - rocksportrocker
1个回答

4

你真的需要查看吗?这个正则表达式应该可以胜任:[^KR]*[KR]

In [1]: import re                        # Import the regex library
In [2]: s = "AAAKBBBBR"                  # Define the input string
In [3]: re.findall(r'[^KR]*[KR]', s)     # Find all the matches in the string
Out[3]: ['AAAK', 'BBBBR']

正则表达式解释:

[^KR] # ^ in character classes is negation so will match any character except K/R
*     # Quantifier used to match zero or more of the previous expression
[KR]  # Simple character class matching K/R

用简单的话来说,匹配零个或多个不是K/R的字符,然后再跟着一个K/R。 如果要匹配至少一个或更多的情况,您可能希望使用+量词,而不是*
In [1]: import re    
In [2]: s = "KAAAKBBBBR"
In [3]: re.findall(r'[^KR]*[KR]', s)
Out[3]: ['K', 'AAAK', 'BBBBR']
In [4]: re.findall(r'[^KR]+[KR]', s)
Out[4]: ['AAAK', 'BBBBR']

为了使末尾的[KR]可选,您可以使用?:
In [5]: s = 'AAAKBBBBRAAA'
In [6]: re.findall(r'[^KR]+[KR]?', s)
Out[6]: ['AAAK', 'BBBBR', 'AAA']

1
抱歉,我以为你已经在使用环视了,所以认为你会理解我提出的正则表达式。我已经添加了一个解释。 - Chris Seymour
1
Python确实没有像perl那样的本地正则表达式字符串,但在底层它使用的是libpcre(与perl兼容的正则表达式),因此任何使用perl正则表达式的功能都可以从Python中完成,您只需要使用函数https://docs.python.org/2/library/re.html - Chris Seymour
我们实际上不需要在这个例子中使用原始字符串,但这是一个好的习惯。原始字符串意味着Python不会对字符串进行任何解释,通常当您实际上想要匹配一个字面上的\时,它不会阻止正则表达式函数正确解释正则表达式。 - Chris Seymour
哎呀,他最后匹配了一个空的子字符串...这太烦人了,找不到令人满意的解决方案。 - user3182532
@user3182532 确保你使用的是 + 而不是 * - Chris Seymour
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接