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

Python 搜索字符串并仅返回我指定的内容,python,python-3.x,Python,Python 3.x,希望这篇文章进展得更好 所以我被这个程序的这个特性所困扰,它将返回指定了某个关键字的整个单词 ie-如果我告诉它在字符串“布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉等”中查找单词“I=”,那么它将返回找到它的整个单词,因此在本例中,它将返回I=1mV 我尝试了很多不同的方法,比如 text = "One of the values, I=1mV is used" print(re.split('

希望这篇文章进展得更好

所以我被这个程序的这个特性所困扰,它将返回指定了某个关键字的整个单词

ie-如果我告诉它在字符串“布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉等”中查找单词“I=”,那么它将返回找到它的整个单词,因此在本例中,它将返回I=1mV

我尝试了很多不同的方法,比如

text = "One of the values, I=1mV is used"
print(re.split('I=', text))
但是,它返回的字符串中没有I,因此它将返回

['One of the values, ', '1mV is used']
如果我尝试正则表达式解决方案,我会遇到一个问题,即数字可能超过1位,因此,只有当数字为1位时,下面的代码才起作用。如果I=10mV是该值,它将只返回一个,但是如果我有两次[/0-9],代码将不再只使用1个值

text = "One of the values, I=1mV is used"
print(re.findall("I=[/0-9]", text))

['I=1'] 
当我尝试使用re.match时

text = "One of the values, I=1mV is used"
print(re.search("I=", text))

<_sre.SRE_Match object at 0x02408BF0>
text=“使用其中一个值,I=1mV”
打印(重新搜索(“I=,text))

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

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

>>> text = "One of the values, I=1mV is used"
>>> words = text.split()
>>> words
['One', 'of', 'the', 'values,', 'I=1mV', 'is', 'used']
然后过滤单词以找到您需要的单词:

>>> [w for w in words if 'I=' in w]
['I=1mV']
这将返回包含
I=
的所有单词的列表。然后,我们只需获取找到的第一个元素:

>>> [w for w in words if 'I=' in w][0]
'I=1mV'
完成了!我们可以做的是稍微清理一下,只查找第一个匹配项,而不是检查每个单词。我们可以使用生成器表达式:

>>> next(w for w in words if 'I=' in w)
'I=1mV'

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

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

>>> text = "One of the values, I=1mV is used"
>>> words = text.split()
>>> words
['One', 'of', 'the', 'values,', 'I=1mV', 'is', 'used']
import re
text = "One of the values, I=1mV is used"
l = (re.split('I=', text))
print str(l[1]).split(' ') [0]
然后过滤单词以找到您需要的单词:

>>> [w for w in words if 'I=' in w]
['I=1mV']
这将返回包含
I=
的所有单词的列表。然后,我们只需获取找到的第一个元素:

>>> [w for w in words if 'I=' in w][0]
'I=1mV'
完成了!我们可以做的是稍微清理一下,只查找第一个匹配项,而不是检查每个单词。我们可以使用生成器表达式:

>>> next(w for w in words if 'I=' in w)
'I=1mV'
当然,您可以调整
if
条件以更好地满足您的需要,例如,您可以使用检查单词是否以某个字符串开头,或者检查单词是否与模式匹配

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=1mV” 我猜你想知道我是1mv

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

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

这是一个很好的方法,因为可以写“使用其中一个值,I=1mV” 我猜你想知道我是1mv


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

在您的re.findall尝试中,您希望添加一个
+
,这意味着一个或多个。
以下是一些例子:

import re

test = "This is a test with I=1mV, I=1.414mv, I=10mv and I=1.618mv."

result = re.findall(r'I=[\d\.]+m[vV]', test)

print(result)

test = "One of the values, I=1mV is used"

result = re.search(r'I=([\d\.]+m[vV])', test)

print(result.group(1))
第一次打印是:
['I=1mV'、'I=1.414mv'、'I=10mv'、'I=1.618mv']

我对搜索示例中的
I=
以外的所有内容进行了分组,
所以第二次打印是:
1mV


如果您有兴趣提取它。

在您的re.findall尝试中,您希望添加一个
+
,这意味着一个或多个。
以下是一些例子:

import re

test = "This is a test with I=1mV, I=1.414mv, I=10mv and I=1.618mv."

result = re.findall(r'I=[\d\.]+m[vV]', test)

print(result)

test = "One of the values, I=1mV is used"

result = re.search(r'I=([\d\.]+m[vV])', test)

print(result.group(1))
第一次打印是:
['I=1mV'、'I=1.414mv'、'I=10mv'、'I=1.618mv']

我对搜索示例中的
I=
以外的所有内容进行了分组,
所以第二次打印是:
1mV

如果您有兴趣提取它。

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

>>> my_text = "Loadflow current was I=30.63kA"
>>> my_text.partition("I=")
('Loadflow current was ', 'I=', '30.63kA')
使用正则表达式 更灵活、更健壮的解决方案是使用正则表达式:

>>> 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'
>>重新导入
>>>图案=r“”
…I=#特定字符串“I=”
…\s*#可能的空白
…-?#可能的减号
…\s*#可能的空白
…\d+#至少一位数字
…(\.\d+)?可能的小数部分
... """
>>>m=re.search(模式、我的文本、re.VERBOSE)
>>>m
>>>m.集团()
“I=30.63”
这说明了更多的可能性(负数、整数或十进制数)

注意使用:

  • 量词表示你想要的每件事物的数量。
    • a*
      -零个或更多
      a
      s
    • a+
      -至少一个
      a
    • a?
      -“可选”-一或零
      a
      s
  • 带注释的详细正则表达式(
    re.Verbose
    flag)——比非详细等价物
    I=\s?-?\s?\d+(\。\d+)
    更容易理解上述模式
  • regexp模式的原始字符串,
    r“…”
    而不是普通字符串
    “…”
    ——意味着不必转义文本反斜杠。此处不需要,因为我们的模式不使用反斜杠,但有一天您需要匹配
    C:\Program Files\…
    ,在这一天您将需要原始字符串
练习
  • 练习1:如何扩展它,使其也能与单位匹配?您如何扩展它,使其能够匹配单位为
    mA
    A
    ,或
    kA
    ?提示:“交替运算符”

  • 练习2:如何扩展它,使其能够匹配工程符号中的数字,即“1.00e3”或“-3.141e-4”

使用字符串方法 作为记录,您尝试使用
I=
作为分隔符将字符串拆分为两半几乎是正确的。而不是使用
str.spl