首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索字符串并仅返回我指定的内容

搜索字符串并仅返回我指定的内容
EN

Stack Overflow用户
提问于 2012-04-04 10:29:35
回答 4查看 109关注 0票数 0

希望这篇文章能变得更好。

所以我被这个程序的这个功能卡住了,它将返回指定了某个关键字的整个单词。

ie -如果我告诉它在字符串"blah I=1mV blah blah etc?“中查找单词"I=”,那么它将返回找到它的整个单词,所以在本例中,它将返回I=1mV。

我尝试了一系列不同的方法,例如,

代码语言:javascript
复制
text = "One of the values, I=1mV is used"
print(re.split('I=', text))

但是,这将返回没有i的相同字符串,因此它将返回

代码语言:javascript
复制
['One of the values, ', '1mV is used']

如果我尝试正则表达式解决方案,我会遇到一个问题,数字可能超过1位,所以这段代码只有在数字是1位时才有效。如果I=10mV是该值,它将只返回1,但是如果我有两次/0-9,代码将不再只使用1值。

代码语言:javascript
复制
text = "One of the values, I=1mV is used"
print(re.findall("I=[/0-9]", text))

['I=1'] 

当我尝试使用re.match时,

代码语言:javascript
复制
text = "One of the values, I=1mV is used"
print(re.search("I=", text))

<_sre.SRE_Match object at 0x02408BF0>

检索单词(在本例中,我想检索I=1mV)并去掉字符串的其余部分的好方法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-04 10:37:24

更好的方法是先将文本拆分成单词:

代码语言:javascript
复制
>>> text = "One of the values, I=1mV is used"
>>> words = text.split()
>>> words
['One', 'of', 'the', 'values,', 'I=1mV', 'is', 'used']

然后过滤单词以找到您需要的单词:

代码语言:javascript
复制
>>> [w for w in words if 'I=' in w]
['I=1mV']

这将返回包含I=的所有单词的列表。然后我们可以只取找到的第一个元素:

代码语言:javascript
复制
>>> [w for w in words if 'I=' in w][0]
'I=1mV'

完成了!我们可以做的是只查找第一个匹配项,而不是检查每个单词。为此,我们可以使用生成器表达式:

代码语言:javascript
复制
>>> next(w for w in words if 'I=' in w)
'I=1mV'

当然,您可以调整if条件以更好地满足您的需求,例如,您可以使用str.startswith()检查单词是否以某个字符串开头,或者使用re.match()检查单词是否与某个模式匹配。

票数 2
EN

Stack Overflow用户

发布于 2012-04-04 12:22:38

使用字符串方法

根据记录,您使用I=作为分隔符将字符串一分为二的尝试几乎是正确的。您可以使用保留分隔符的str.partition(),而不是使用丢弃分隔符的str.split()

代码语言:javascript
复制
>>> my_text = "Loadflow current was I=30.63kA"
>>> my_text.partition("I=")
('Loadflow current was ', 'I=', '30.63kA')

使用正则表达式

更灵活、更健壮的解决方案是使用正则表达式:

代码语言:javascript
复制
>>> import re
>>> pattern = r"""
... I=             # specific string "I="
... \s*            # Possible whitespace
... -?             # possible minus sign
... \s*            # possible whitespace
... \d+            # at least one digit
... (\.\d+)?       # possible decimal part
... """
>>> m = re.search(pattern, my_text, re.VERBOSE)
>>> m
<_sre.SRE_Match object at 0x044CCFA0>
>>> m.group()
'I=30.63'

这说明了更多的可能性(负数、整数或十进制数)。

请注意以下的用法:

  • 量词来表示你想要的每件东西的数量。
    • a* -零个或多个as
    • a+ -至少一个a
    • a? -“可选”-一个或零个as

带注释的

  • 详细正则表达式(re.VERBOSE标志)-比非冗长的等效模式更容易理解上面的模式,正则表达式模式的I=\s?-?\s?\d+(\.\d+).
  • Raw字符串,r"..."而不是普通字符串"..." -意味着文字反斜杠不必转义。这里不需要,因为我们的模式不使用反斜杠,但是有一天你需要匹配C:\Program Files\...,到那一天你将需要原始字符串。

练习

  • 练习1:如何扩展它,使其也可以与单元匹配?您如何对其进行扩展,使其可以与mAAkA单元相匹配?提示:"Alternation operator".
  • Exercise 2:如何扩展它,使其能够匹配工程符号中的数字,即"1.00e3",或"-3.141e-4"?
票数 2
EN

Stack Overflow用户

发布于 2012-04-04 10:39:35

代码语言:javascript
复制
import re
text = "One of the values, I=1mV is used"
l = (re.split('I=', text))
print str(l[1]).split(' ') [0]

如果您有多个I=,请对l中的每个奇数索引执行上述操作,因为0是第一个索引。

这是一个很好的方法,因为你可以写“其中一个值,使用了I= 1 1mv”,我猜你想要得到i是1 1mV。

顺便说一句,I是电流,其单位是安培,而不是伏特:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10004194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档