Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的正负正则表达式_Python_Regex - Fatal编程技术网

Python中的正负正则表达式

Python中的正负正则表达式,python,regex,Python,Regex,我在Python中使用正则表达式已经有一段时间了,我想知道是否可以让正则表达式匹配一行中有值但在同一行中没有值的行: 给出一句话:filename.txt opt1 opt2 opt4 我想说查找没有选项3的filename.txt 我使用了:^(?。*opt3)。*filename.txt. 我不喜欢这样读,但这是唯一可行的技术如果你想要一个正则表达式,那么你的方法就是我如何做到这一点,但是你应该在各个术语周围设置单词边界: ^(?!.*\bopt3\b).*\bfilename.txt\b.

我在Python中使用正则表达式已经有一段时间了,我想知道是否可以让正则表达式匹配一行中有值但在同一行中没有值的行:

给出一句话:
filename.txt opt1 opt2 opt4

我想说查找没有选项3的filename.txt

我使用了:
^(?。*opt3)。*filename.txt.


我不喜欢这样读,但这是唯一可行的技术如果你想要一个正则表达式,那么你的方法就是我如何做到这一点,但是你应该在各个术语周围设置单词边界:

^(?!.*\bopt3\b).*\bfilename.txt\b.*$
您也可以使用两个单独的调用
re.search
,例如

line = "filename.txt  opt1 opt2 opt4"
if re.search(r'^.*\bfilename.txt\b.*$', line) and not re.search(r'^.*\bopt3\b.*$', line):
    print("line is a match")
也许

^(?!.*opt3)filename\.txt
也许就足够了

以防万一,
filename.txt
不会在字符串的开头,那么

^(?!.*opt3).*(filename\.txt)
这也是一个值得研究的选择

正则表达式电路 可视化正则表达式:

测试1 产出1
测试2 如果要滑动整个字符串,只需在表达式末尾添加一个
*

import re

string = '''
filename.txt  opt1 opt2 opt4
filename.txt  opt1 opt2 opt3 opt4
 filename.txt  opt1 opt2 opt4
  filename.txt  opt1 opt2 opt3 opt4
'''

expression = r'^(?!.*opt3).*filename\.txt.*'

print(re.findall(expression, string, re.M))
产出2 测试3 输出
在您在注释中尝试的代码中,的第一个参数是模式,第二个参数是字符串

您的代码可能看起来像

import re
match = re.search('^(?!.*opt3)FileName\.abc', 'FileName.abc 0 opt1 opt2 opt4')
if match:
    print(re.group())

如果字符串中不应该是opt3,但opt3可以是较大字符串的一部分,则可以使用lookarounds确保opt3不被非空白字符包围

^(?!.*(?<!\S)opt3(?!\S))filename\.txt
^(?)*(?
  • ^
    字符串的开头
  • (?!
    负前瞻,断言右边的不是
    • *
      匹配除换行符以外的任何字符0+次
    • (?match
      opt3
      未被非空白字符包围
  • 关闭前瞻
  • filename\.txt
    逐字匹配

如果
filename
包括
opt3
这对我不起作用,这将给你带来一个问题。重新搜索('filename.abc 0 opt1 opt2 opt4','^(?!opt3)filename\.abc')!=none这也不起作用。重新搜索('filename.abc 0 opt1 opt2 opt4','^(?。*opt3)。*(filename\.abc)!=none那是有趣的re.findall()正在查找它,但它需要第3个参数和re.M。否则它将返回一个空列表。re.search()根本找不到它。好的……我现在明白了……基本上,这个答案很简单,在search()中显示了正确的字符串。我的原始文本有一个额外的字符。太接近了。@Keith欢迎您。
['filename.txt  opt1 opt2 opt4', ' filename.txt  opt1 opt2 opt4']
import re

string = '''
filename.txt  opt1 opt2 opt4
filename.txt  opt1 opt2 opt3 opt4
 filename.txt  opt1 opt2 opt4
  filename.txt  opt1 opt2 opt3 opt4
'''

expression = r'(?m)^(?!.*opt3).*filename\.txt.*'

print(re.findall(expression, string))

for item in re.finditer(expression, string):
    print(item.group(0))
['filename.txt  opt1 opt2 opt4', ' filename.txt  opt1 opt2 opt4']
filename.txt  opt1 opt2 opt4
 filename.txt  opt1 opt2 opt4
import re
match = re.search('^(?!.*opt3)FileName\.abc', 'FileName.abc 0 opt1 opt2 opt4')
if match:
    print(re.group())
^(?!.*(?<!\S)opt3(?!\S))filename\.txt