2014-05-13 50 views
1

我试图提取使用正则表达式的子字符串的位置(索引)。我需要使用正则表达式,因为字符串不会完全相同。我想获取子字符串的位置(无论是开始位置还是结束位置),因此我可以在该子字符串后面输入1,000个字符。使用正则表达式来提取字符串位置Python

例如,如果我有“而外币频繁交易,大部分赚的钱很少”。我想找到“外币”的位置,这样我就可以得到所有的单词。

f5是正文。

我已经试过:

p = re.compile("((^\s*|\.\s*)foreign\s*(currency|currencies))?") 
for m in p.finditer(f5): 
    print m.start(), m.group() 

得到的位置。这给了我(0,0),即使我已经检查过以确保正则表达式在文本中找到我要找的东西。

我也试过:

location = re.search(r"((^\s*|\.\s*)foreign\s*(currency|currencies))?", f5) 
print location 

输出为0x297d3328>

< _sre.SRE_Match如果我我得到(0,0)再次尝试

location.span() 

基本上,我想将< _sre.SRE_Match在0x297d3328>转换为一个整数,该整数给出搜索词的位置。

我花了半天的时间寻找解决方案。谢谢你的帮助。

+0

你能不能给一个'f5'不工作,这应该的[短,可复制示例](http://www.sscce.org/)? – DSM

+0

SRE_Match是Python中的一个匹配对象,因此您根本不会转换它。对于一个实例,您需要通过'group()'将对象从对象中提取出来。 – Signus

回答

1

除了以前的解决方案/意见,如果你希望所有的话后,你可以这样做:

>>> location = re.search(r".*foreign\s*currenc(y|ies)(.*)", f5) 
>>> location.group(2) 
' are traded frequently, very little money is made by most.' 

.group(2)部分匹配正则表达式的(.*)

+0

使用非捕获组“(?:y | ies)”和“(。*)”将在组1中被捕获(稍微更加逻辑/可读)。 – Sam

+0

这个伎俩!非常感谢。 – user2649353

1

您的模式包含“foreign”之前的所有内容。所以python会考虑你的匹配部分。如果你想放弃,只需从搜索字符串中删除它。

尝试:

p = re.compile('foreign\s+(currency|currencies)?') 
m = p.search(s) 
m.start() 

这也适用于finditer

for m in p.finditer(s): 
    m.start() 
0

不必在Python很多经验,所以我不能直接回答你的问题。但是,如果你想从匹配开始的子字符串,为什么你不匹配字符串的其余部分,或者在匹配之前删除所有内容。

Example 1:

比赛foreign currenc(y|ies)然后在字符串中的每个其它字符。我使用了s修饰符,以便点也匹配新行。

foreign\s+currenc(?:y|ies).* 

Example 2:

与空字符串替换此表达式。这将懒惰地匹配所有东西,直到foreign currenc(y|ies)的前视图匹配。

.*?(?=foreign\s+currenc(?:y|ies)) 

注:我改变(currency|currencies)currenc(?:y|ies),因为它是slightly more efficient