Python 正则表达式重复字符串

Python 正则表达式重复字符串,python,regex,Python,Regex,我需要以下文本的正则表达式。 我已经尝试了很多东西,但总是只匹配最后两组,或者匹配“someText 1&someText 2&someText 3&”作为一组 someText 1 & someText 2 & someText 3 someText 1 & someText 2 & someText 3 & someText 4 我所期望的是两种匹配: 匹配1: 一些文字1 一些文本2 一些文字3 及 比赛2: 一些文字1 一些文本2 一些文字

我需要以下文本的正则表达式。 我已经尝试了很多东西,但总是只匹配最后两组,或者匹配“someText 1&someText 2&someText 3&”作为一组

someText 1 & someText 2 & someText 3
someText 1 & someText 2 & someText 3 & someText 4
我所期望的是两种匹配:

匹配1:

  • 一些文字1
  • 一些文本2
  • 一些文字3

比赛2:

  • 一些文字1
  • 一些文本2
  • 一些文字3
  • 一些文字4

这适用于提供的示例文本和所需结果:

\S+\s\d

\S+ match any non-white space character [^\r\n\t\f ]
Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy]

\s match any white space character [\r\n\t\f ]
\d match a digit [0-9]

如果我阅读正确,那么您正试图捕获任意数量的“&”分隔项(每行)到捕获组中

对于纯正则表达式,这是不可能的。由于regex作为状态机运行,因此不能有任意数量的捕获组。任何给定的表达式都有固定数量的捕获组,这些捕获组可以或可能捕获任何内容。该数字由表达式决定(基本上是括号的数量),不能更改

相反,您可以执行类似的操作来捕获分隔符。因此,与其尝试匹配“someText 3”,不如匹配并拆分“&”

我不知道您使用的是什么语言,下面是一些Javascript示例代码:

// Test input, as provided.
var inputString = "someText 1 & someText 2 & someText 3\nsomeText 1 & someText 2 & someText 3 & someText 4";

// Break up the lines. (Replace this with however you get your lines separated.)
var line_delimit = /[\n\r]+/;
var lines = inputString.split(line_delimit);

// Split each line on ampersands.
var group_delimit = /\s*&\s*/;
var matches = [];
lines.forEach(function(line){
    matches.push(line.split(group_delimit));
});

// Display.
for (var index in matches){
    console.log("Match " + index + ":");
    console.log(JSON.stringify(matches[index],null,2));
    console.log();
}
我想他知道些什么,但他还没完全明白

你不应该试图用纯正则表达式来做这件事。保持简单。首先,您应该将字符串拆分为
&

>>> s = 'someText 1 & someText 2 & someText 3 & someText 4'
>>> s.split('&')
['someText 1 ', ' someText 2 ', ' someText 3 ', ' someText 4']
(当然,这假设
someText
不能包含
&
,但如果可以的话,问题要复杂得多。)

然后我们需要去除前导和尾随的空白:

>>> s_clean = [i.strip() for i in s.split('&')]
>>> s_clean
['someText 1', 'someText 2', 'someText 3', 'someText 4']
现在,我们可以使用正则表达式过滤掉不匹配的元素:

>>> import re
>>> [i for i in s_clean if re.match('.+\s+[0-9]+', i)]
['someText 1', 'someText 2', 'someText 3', 'someText 4']
(请注意,
re.match
实际上返回一个
match
对象,而不是布尔值。)

这就是你想要的。缩短时间:

s = 'someText 1 & someText 2 & someText 3 & someText 4'
s_clean = [i.strip() for i in s.split('&')]
result = [i for i in s_clean if re.match('.+\s+[0-9]+', i)]
如果你想的话,你可以把它变成一行,但它看起来会更凌乱

现在,对自己重复以下行3次:

Regex并不是解决所有文本处理问题的通用解决方案


考虑到您正在使用Python,您需要模块和
re.findall
方法

例如,您可以使用:

import re
import fileinput

p1 = re.compile(r'\s*(\S[^&]*)\s+(&|$)')

for line in fileinput.input():
    matches = p1.findall(line)
    print "Line: ", line
    for match in matches:
        print "Match: ", match
    print ""
正则表达式查找可选的空白(
\s*
),然后捕获一个非空白,后跟零个或多个非安培数(
(\s[^&]*)
),后跟空白和
&
或字符串结尾(
\s+(&|$)

包含问题中显示的两条采样线的给定输入:

sometext1&sometext2&sometext3
一些文本1和一些文本2和一些文本3和一些文本4
输出为:

Line:sometext1&sometext2&sometext3
匹配:('someText 1'、'&')
匹配:('someText 2'、'&')
匹配:('someText 3','')
行:一些文本1和一些文本2和一些文本3和一些文本4
匹配:('someText 1'、'&')
匹配:('someText 2'、'&')
匹配:('someText 3'、'&')
匹配:('someText 4','')

可以应用无休止的调整,例如使用
(?:&|$)
,因此只有一个捕获组-输出就是“
someText N
”字符串。您也可以使用非贪婪匹配
[^&]*?
,尽管它可以按编写的方式工作。如果存在相邻的
&
字符,则第二个字符将被视为下一个字符串开头的非空白字符。如果您认为这可能是一个真正的问题,您可以解决它。

您做了哪些尝试?如果有,请提供,以便您可以获得进一步的帮助。还有
someText
中可能包含哪些类型的字符等?您使用的是什么运行时?这是JavaScript、Python、.NET、Java、Ruby还是其他什么?我们需要知道,这样我们才能测试结果。对不起,我已经删除了正则表达式,因为它们不起作用@jpmc26 PythonWelcome到堆栈溢出。请尽快阅读这一页。您应该指出使用正则表达式的主机语言。到目前为止,你也应该表现出你最大的努力——你尝试了什么?或者一对。您可以在包含数据的字符串上迭代调用正则表达式,还是必须是单个模式?您的代码是否能够处理缺少的字段。数据集是否少于3组或多于4组?是否因为这是家庭作业而使用正则表达式?因为如果你有一个带分隔符的字符串,我想你只想在分隔符上拆分它,而不是使用正则表达式…这是一个示例,而不是“someText 1”,也可以是“fagSDGar23132!”!“§$1'@False您应该在问题中澄清“文本”可以变化,并且您还应该澄清它可以包含哪些符号。在模式匹配方面,这些是非常重要的方面。我同意“对于纯正则表达式,这是不可能的”。OP使用Python(看他们对这个问题的第一个评论——以及我根据这个评论添加的标签)。哎呀,我没有注意到Python标签。唉,我也不懂Python,所以希望我的JS至少能帮上忙。如果有人想把它重新写成Python,那就请便。